マルチバイト
開発環境と本番環境で動作が違うなあ、と思っていたら、開発環境でphp.iniのマルチバイト関係の設定
mbstring.language = Japanese mbstring.internal_encoding = EUC-JP
あたりを設定し忘れていたのであった。どちらの環境も、
mbstring.func_overload = 6
になっていて、例えばstrlenという関数を使うとmb_strlenというマルチバイト対応の関数に置き換わるような設定なのだけれども、最初の2つの設定が違うせいで動作が違っていたようだ。
開発環境のphp.iniを書き替えたところ、本番環境と同じになったのだけれども、悩ましい問題が。今までstrlenを使って40文字でカットしていたのだけど、今まではマルチバイト非対応だったので40バイト=全角20文字でカットされていた。今度は40文字でカットすると全角で40文字でカットされるようになってしまい、長すぎる。かといって20文字でカットすると、全部半角だったときに短すぎる。
悩んでいると、mb_strimwidthなる関数を発見。これは「半角は1文字、全角は2文字として計算される」らしい。これでばっちり。