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);

以下が参考になりますが、地道な作業ですね。