文字コード : してログ

今まで、BOM 付き UTF-8 のテキストデータを扱う時、substr($str,3) とかで BOM を取り除いていたのですが、これだと BOM 無しの UTF-8N ではデータまで削ってしまいます。どちらでもうまく処理できるように、正規表現で書き直してみましたので今度からはこちらで行きます。

$str = preg_replace('/^\xEF\xBB\xBF/','',$str);

なお、PHP コード自体は BOM 無しの UTF-8N で書く必要があります。普段 UTF-8N で保存できるエディタを使用していても、本番環境などでうっかり Windows のメモ帳なんかで編集してしまうと、予期せぬエラーを招くので要注意です。

これめんどくさいから言語のほうで吸収してくれんかなと、ときどき思います。それか、UTF-8 と UTF-8N をはっきり区別して扱えるようにしてほしい。せっかく文字コードで悩まなくて済むようになったはずなのに、こういう混乱を招く仕様をなぜ入れてしまったのだろうか。

SJISのテキストファイルなどで機種依存文字(①,②,③,Ⅰ,Ⅱ,Ⅲ,㈱,㎝ など)を含むデータを読み込むときに、これらの文字が「?」に化けないようにします。例えば、Windowsで作成されたCSVファイルですが、次のように変換してしまうと「?」に化けてしまいますので要注意です。

mb_convert_encoding($str, 'UTF8', 'SJIS');

機種依存文字が無い場合はこれでもうまく行きますが、それが含まれる場合は次のように変換します。

mb_convert_encoding($str, 'UTF8', 'SJIS-win');

もしくは、

mb_convert_encoding($str, 'UTF8', 'CP932');

当たり前だが、UTF-8以外に変換すると化けるし、「~」などダメな場合もあり、オールマイティじゃないので注意です。そうした場合は、予め置換しておくなどの対処が必要かと思います。