私が作るPHPのサイトは、大概、EUC-JPを内部エンコーディングと設定して作成しています。それで今まで特に困ったことはなかった(自動応答メールなどに「㈱」「髙」などの機種依存文字が含まれていると文字化けすることはありましたが、そのような場合、そのような文字を入力するユーザーの知識不足を問題視していることが実際多かったのですが・・・。)のですが、今回は困りました。
いわゆる機種依存文字(「①」「㈱」「Ⅱ」「㌔」など)をEUC-JPからUTF-8へ変換しようとすると、該当文字が「?」(クエスチョンマーク・はてなマーク)に化けてしまいます。変換不能状態です。我ながら今更ですが、mb_convert_encoding()関数において、「eucJP-win→UTF-8」のようににするとこれらの文字変換はうまくできるようになることが分かりました(=下記サンプルコードの方法2)。
ただし、「髙」「纊」「忞」などの変換はできません。13区の特殊文字は、eucJP-winにすることで変換できましたが、「IBM拡張文字」もしくは「NEC選定IBM拡張文字」(PHPが結局、この2種類の拡張文字のどちらをどのように使い分けているのかについての考察はいつかしたいですが、今は省きます。)の文字コード変換はできず、どうしたものかと悩んでいました。
ところが、思いつきで、一旦、SJISに変換してからUTF-8に変換したらどうなるかと考えて、ただの?SJISではなく、sjis-winに変換後、さらにUTF-8に変換すると、うまくいうことが判明しました。まとめると、下記のようになりました。
方法1では、ぜんぜん駄目で、「?あいa???????アイウエオ」になりました。方法2では、13区の特殊文字はクリアできましたので、「あいa①㈱Ⅲ㌔アイウエオ」のようになりました。方法3では、「纊あいa忞寬①㈱Ⅲ㌔髙アイウエオ」のようになり、完全勝利です。
しかし、です。これは、あまりスマートではありません。何かいい方法はないものかと思索中です。


