とある掲示板プログラムでサーバーの引越しをしてから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');
コメント