2016.03.13
先日から、当サイトで使っている「Coolyze」と言うアクセス数記録プログラムが一部の日本語を出力してくれなくなりました。
PHPで書かれているものです。
いろいろ悩んだ結果、原因が分かったので覚え書きとして記録しておきます。

結論としては、PHPのバージョンをPHP5.4.0にアップデートしたことで、
「htmlspecialchars()」という関数の動作が一部変わったことにありました。
この関数は、HTMLに文字を出力する際に、特殊文字(「<」とか「>」とか「”」とか)を、
タグとしてではなく文字として出力するように変換してくれるものです。

書式は以下の通り

htmlspecialchars('文字列'[,エスケープの種類,'文字コード'])

第2引数、第3引数は省略可能です。
返り値は、デコードされた文字列です。
有効でない文字は切り捨てられます。

さて、この関数ですが、PHP5.4.0以前は第3引数を省略すると文字コードを「ISO-8859-1」として処理していました。
しかし、PHP5.4.0からは「UTF-8」として処理するように変更されました。
元からUTF-8で書かれたコードなら問題は無いのですが、EUC-JPやShift_JISで書かれている場合、
有効でない文字と認識されて切り捨てられてしまうことで、文字が表示されなくなります。

と言うわけで対処法。
文字コードを指定してやれば表示されるようになります。
この場合、エスケープの種類は省略時は「ENT_COMPAT」なので、
「htmlspecialchars($char,ENT_COMPAT,"SJIS");」
「htmlspecialchars($char,ENT_COMPAT,"EUC-JP");」
などと修正することで、正常な動作が出来るようになります。

……と、自分向けの備忘録として。すぐ忘れてまたパニックになりそう。

- CafeNote -