UTF-8 is not enough
下記のUNICODEをめぐる話を読んで。
- シフトJISを捨てられるか?:ITpro
- http://www.rubyist.net/~matz/20070312.html#p02
- http://d.hatena.ne.jp/odz/20070318
プログラムを国際化対応する場合に選択すべきエンコーディングとして、普及度やツールの対応からして、現時点で最も現実的なのはUTF-8だろう。そこはMatz氏に同意。
ただWindowsユーザーとして、Shift-JISからUTF-8に移行する場合の障害になると思っているのが変換テーブルの非互換性問題だ。全角ハイフン − とか全角の波線 〜 が文字化けするのである。こんな感じ。
原因はWindowsの変換テーブル(codepage 932、通称CP932)が腐ってるということみたいなのだが、大量に出回ってサポートも終わっているWindows NTとか2000とかの対応をいまさら変えるわけにもいかないだろうし、XPやVistaでも変わっていないようだ(変えたら変えたで互換性が維持できない)。
Shift-JISも、Windowsが使用しているShift-JISはWindows-31Jとのことで、同様にWindowsのメモ帳とかで生成されるUTF-8ファイル(波線が0xFF5E)もWindows-UTF-8とでもいうべきか。昔からNEC文字とか色々あったわけだが、波線みたいに割とよく使う文字が化けるというのは非常にいただけないと思う。UTF-8のデータ交換が当たり前になるとこの問題はもっと大きくなるんじゃないかという気がする。
今のところ私はXML-RPCでwebにpostするときなど、非Windows系とデータ交換する場合は変換の前後で
// 正規系→CP932 if (c == 0x301C) c = 0xFF5E; if (c == 0x2212) c = 0xFF0D; WideCharToMultiByte(... // CP932→正規系 MultiByteToWideChar(... if (c == 0xFF5E) c = 0x301C; if (c == 0xFF0D) c = 0x2212;
みたいなベタな細工をしているんだけど、そういうアドホックなやり方はよくないし、同じUTF-8という名前で呼ぶものが一意でないというのは問題だよなあ。