PHPでUnicode(UTF-8)の中黒などを含む文字列をJISコードに変換すると、うまくコードが変換できなくて「?」などの文字に化けてしまうことがあります。
例えば、以下のPHPプログラム(UTF-8)ですが、UTF-8からISO-2022-JP(JIS)に変換し、改めて、UTF-8に書き戻すと、中黒が「?」に変わってしまいます。
<?php $str = "・今日"; $str = mb_convert_encoding($str, "ISO-2022-JP", "UTF-8"); $str = mb_convert_encoding($str, "UTF-8", "ISO-2022-JP"); print($str);
実行すると「?今日」と表示されます。Unicodeの中黒(\uFF65,UTF-8のef bd a5)が正しく変換できないのが問題です。
そこで、少し調べてみると、PHP5.2.1からISO-2022-JP-MSというコードが追加されているのが分かります。ISO-2022-JPをISO-2022-JP-MSに変更することで、この問題は解決します。
あるいは、UTF-8で化けるコードを適当に別の文字に変換しておくことで、?に化けてしまうのを防ぐことができます。
<?php $str = "・今日"; // (解決策) 問題となる中黒をあらかじめ変換してしまう $str = str_replace("\xef\xbd\xa5", "・", $str); // $str = mb_convert_encoding($str, "ISO-2022-JP", "UTF-8"); $str = mb_convert_encoding($str, "UTF-8", "ISO-2022-JP"); print($str);
以下が参考になりますが、地道な作業ですね。