POST する文字列によって化けたり化けなかったりする問題を調査する修行

とある PHP な WEB アプリにおける文字化けの調査依頼。ある機能で特定の文字列を入力すると、次の完了画面で今入れた文字列部分だけが文字化けして表示される。同じ機能で別の文字列を入力すると文字化けしない。化けた文字列は半角カタカナになっている。

とりあえず Fiddler で元の画面が EUC-JP であること、POST している値も EUC-JP になっていることを確認。

mbstring.http_input の値を見ると、ASCII, JIS, SJIS, EUC-JP, UTF-8 となっている。おそらく、Shift-JIS としても解釈可能なバイト列が POST された場合、Shift-JIS として解釈して内部エンコーディングに変換してしまったのだろう。Shift-JIS としてはありえないバイト列であれば EUC として再変換するので正しく登録できたものがあったと。

とりあえず、ASCII の次に EUC-JP がくるように変更してもらったところ、問題が解消することを確認。