POSTすると日本語が消えてしまう。PHP5.4~ htmlspecialcharsの使い方が変わっているので注意

PHP

とある掲示板プログラムでサーバーの引越しをしてからPOSTされた日本語が消えてしまうという不具合が発見されました。
php.iniの文字コード設定関係を疑いまいたが、結果htmlspecialcharsが原因でした。

PHP5.4からhtmlspecialcharsの第3引数を省略するとUTF-8として認識され、有効な文字コードではないので切り捨てられるようです。

なので、htmlspecialcharsを使われているところを探すところから始めました。

使われているhtmlSpecialChars関数をgrepで洗い出し

grep -rin 'htmlSpecialChars'

メモ:grepオプション
-r –recursive 再帰的
-i –ignore-case 大文字小文字判定なし
-n –line-number 行数を表示

実行結果

# grep -nri 'htmlSpecialChars'
bbs/app/Controller.php:309: $value = htmlSpecialChars($value, ENT_QUOTES);
bbs/app/Controller.php:388: return htmlSpecialChars($v, ENT_QUOTES);
bbs/app/Controller.php:926: return htmlSpecialChars($v, ENT_QUOTES);
....
....省略

ちなみに自分が調べたとき、ソースコードに書かれていたのがhtmlspecialcharsではなくhtmlSpecialCharsのように大文字交じりで書かれていたので検索にヒットせず、余計な時間をかけてしまいました。
使われているPHP関数を調べる時は大文字小文字判定をしない-iオプションを忘れずにつけましょう。

上記で見つかったファイルを以下のようにShift_JIS用に修正します。

htmlspecialchars($text, ENT_QUOTES, 'SJIS');

参考

[PHP]htmlspecialchars()を使うと文字が消える? | PHP Archive

コメント

タイトルとURLをコピーしました