EUC-JPのページにおけるWindows外字がめんどくさいことになっている件
- EUC-JPのページにおけるWindows外字の扱いが、ややこしいことになっている。まあ、もともと外字なので化けることがあるのは当然とも言えるのだけれど、化け方のバリエーションが豊富で、どういう理屈で化けているのかがわかりにくい。以下、はてなとmixiで目に付いた文字化けについて、ざっとまとめてみようと思う。
- これは、はてなのサーバがCP51932のNEC選定IBM拡張文字領域をJIS X 0213と見なした上で補助漢字に変換しているためだが、へんな仕様だと思う(下図)。たぶんPerlのEncodeモジュールでEUC-JPをUnicodeに変換した上でEUC-JPに戻しているのだろう*1。
- 前回のエントリで述べたように、SafariにおけるIBM拡張文字の扱いは謎の独自仕様だが、mixiのサーバはこれをeucJP-msのIBM拡張文字と見なした上でCP51932のNEC選定IBM拡張文字に変換しているようだ(下図)。
- この場面では、はてなのサーバは、Safari独自のIBM拡張文字を理解した上でCP51932のNEC選定IBM拡張文字に変換しているように見える(下図)。(括弧内追記。コメント欄でえむけいさんより『「その場編集」モードで化けないのははてながIBM-eucJPを解釈しているからではなく、ブラウザがUTF-8で送信しているからのようです』とのご指摘がありました)
- しかし、Firefoxで正しく「﨑」に見えているはてなダイアリーをブックマークすると、(はてなブックマークのページはEUC-JPではなくUTF-8であるため)たぶんPerlのEncodeでUnicodeに変換されることにより、「粼」に化ける(下図)。
- ちょっと前にkoikekaishoさんから「﨑がSafariで豆腐になるんだよね」という話を聞いたのをきっかけとして、検証したりしているうちに話がふくらんでしまったエントリ。結論としては、EUC-JPのページにおけるWindows外字は数値文字参照で表現するのが安全だと思う。
*1:PerlのEncodeモジュールについては、twitterで@nalshさんからご教示いただきました(http://twitter.com/nalsh/status/43276900684005376)。ありがとうございます。