Services_Twitter0.4.0を日本語で使うための修正
PEARのTwitterライブラリであるServices_Twitterのバージョン0.4.0を使ってTwitterに投稿をしようとすると「statuses/update: status must not exceed 140 chars」とのエラーが出ることがあります。これはつぶやきが140字を超えてはいけないという意味ですが、つぶやきが日本語である場合、140字を超えていないにもかかわらずこのエラーが発生することがあります。
この現象が起こる原因は、Services_Twitter0.4.0が文字列の長さの判定にstrlen関数を使っていることです。strlen関数は日本語をはじめとするマルチバイト文字の文字数を正確に数えることができず、実際の文字数より大きい数字が返ってくるからです。
マルチバイト文字列の文字数を正確に数えるにはマルチバイト文字列に対応したmb_strlen関数を使います。
修正前のソースコードと修正後のコードを以下に示します。修正後のコードではstrlen関数をmb_strlen関数に変更しています。ここではつぶやきの文字コードはUTF-8であるものとします。
修正前
<?php protected function validateArg($name, &$val, $type, $maxLength = null) { // check length if necessary if ($maxLength !== null && strlen($val) > $maxLength) { throw new Exception( $name . ' must not exceed ' . $maxLength . ' chars', self::ERROR_PARAMS ); } ?>
修正後
<?php protected function validateArg($name, &$val, $type, $maxLength = null) { // check length if necessary if ($maxLength !== null && mb_strlen($val,"UTF-8") > $maxLength) { throw new Exception( $name . ' must not exceed ' . $maxLength . ' chars', self::ERROR_PARAMS ); } ?>