帰ってきたHolyGrailとHoryGrailの区別がつかない日記

はてなブログに帰って来ました

で2バイト文字が正常に送信されないときの解決方法

4.1がリリースされてせっかく自宅サーバの環境も徐々に整ってきたので使ってみようと思い
自宅サーバに設置してみました。

ところが、2バイト文字を送信するとなぜか空文字しか入っていない。
というわけでエラーログを見直してみました。

PHP Warning:  mb_convert_encoding()

というエラーが出ていたのでそのあたりを見直し。

// Convert Strings
function convert_str($value, $charset) {
    return htmlspecialchars(mb_convert_encoding($value, $charset, "auto"));
}

どうやらここでエラーが出ているようだったのでこの関数の呼び出し元で
変換もとの文字コードを強制的に指定してやることに

// Convert Strings
function convert_str($value, $charset, $from_encode) {
    return htmlspecialchars(mb_convert_encoding($value, $charset, $from_encode));
}

に変更して

$value = Utility::convert_str($value, "UTF-8", "SJIS");

$tmp_log_mes[$i]['name']    = Utility::convert_str($json_value[$i]['user']['screen_name'], "SJIS", "UTF-8");
$tmp_log_mes[$i]['img']     = Utility::convert_str($json_value[$i]['user']['profile_image_url'], "SJIS", "UTF-8");
$tmp_log_mes[$i]['comment'] = Utility::convert_str($json_value[$i]['text'], "SJIS", "UTF-8");

の部分を変更する。

とりあえず上記の変更でうまく動作することを確認。
でも配布されてるスクリプトを直接いじるってのはあんまりスマートなやりかたじゃないなー、と思いサーバ側の設定を見直してみる。

このあたりを見ながらphp.iniに以下4つの設定を追加

mbstring.language = Japanese
mbstring.http_input = auto
mbstring.http_output = pass
mbstring.detect_order = auto

で、apacheを再起動して再度編集していないスクリプトにアクセスするとうまく動いた。

というわけで自宅サーバでtwitterMobileがうまく動かないという人は上記の設定をしてみるといいかもしれないです。
たぶんレンタルサーバとかだとそのぐらいの設定はちゃんとやってるはず・・・。