PHPでハマったコード マルチバイト系

今日はPHPのコードでハマった。マルチバイト系。忘れないようにメモ。

mb_strlen とか mb_substr とか mb_strpos とか、マルチバイトを扱う組み込み関数は基本的に、最後の引数でエンコーディングを指定可能(しかもオプション)。オプションなんでこれを省略していたら痛い目に遭あった・・・。

エンコーディングを指定しない場合、マルチバイトで扱うエンコーディングはPHPの内部エンコーディングとなる。今回のサーバーは内部エンコーディングが EUC-JP でも UTF8 でもなかったようで、おかげで凄い動作をしてやがった。
例えば、
$text = "あaいiうuえeおo";
print(mb_strpos("a"));
として、文字 "a" が何文字目を出力してみると、こちらが期待するのは「2」なのに、なんと「3」に。明らかに「あ」を2とカウントするという有様。「あ」を1文字としてではなく2バイトと認識しているよう。ぜんぜんマルチバイト扱ってねーし!!

ようやく内部エンコーディングに辿りついて、サーバーの設定が原因まで気づくのに時間がかかった・・・。要は、
$text = "あaいiうuえeおo";
print(mb_strpos("a"), 0, "EUC-JP");
と最後の引数でエンコーディングを指定すればOK。相変わらず何っつー言語なんだPHPはっYO!!

この他にも設定ファイルさわったり .htaccess とかで内部エンコーディング自体をいじる方法があるんだろうけど、サーバーに左右されないどこにでも置けるようなプログラムを考えると、そこはナシかなと。

ちなみに今日開発していたのは、マルチバイト文字のワードラップ関数とか、サイト内検索の該当文字列抜粋ロジックあたりでした。
うーん、忘れないようにメモしているつもりだけど、3日もしたら忘れてるんだろうなぁ。

Trackbacks

Trackback URL: http://blog.naggg.jp/mt/mt-tb.cgi/32

Send Your Comment