2006-06-05
JIS系とCP932系の相互変換
現状で問題になっている(気がする)のはJIS系とCP932系のUnicodeマッピングが非互換だかららしくて、sjis同士*1やeuc-jp同士*2だと(あまり)問題がなくても、Unicodeに変換しちゃうとそれぞれお互いに変換できなくなる。らしい。
であれば、
- Unicodeマッピングに無いものでもレガシーエンコーディングにするときは変換しちゃうようにする
- JIS系かCP932系に正規化するUnicodeのマッピングテーブルを作って、レガシーエンコーディングに変換する前には正規化する
――のどちらかが実現すればちょっと幸せになるような気がする*3。
前者については規格至上主義者の方々が反対するだろうから*4、後者の正規化処理があればいいんじゃないかな~と思うんだけど。
どこかで誰かが実装していないのかな……*5。
UnicodeのU+FF00-U+FFFFって誰が申請(登録)したのかな?
Unicodeの決定プロセスとか知らないんだけど、U+FF00-U+FFFFって日本(と韓国)でしか使っていなさそうな――もっと言えばMicrosoftが好みそうな――コードがみっちり入ってるんだけど、どういう経緯で登録されたんだろうか。
僕の想像(妄想)ではMicrosoftあたりが「日本じゃASCIIと同じ記号の『全角文字』ってのがないと駄目らしいよ?」とか言って――だからFULLWIDTHなんていう日本人以外*6には意味不明な名称がついてる――登録したんじゃないかと*7。だから
$str =~ tr/\x21-\x7e/\x{ff01}-\x{ff5e}/;
ってな感じで、完全に1対1対応になってるんじゃないだろうか。だからMicrosoftにとって「~」はFULLWIDTH TILDEであってもWAVE DASHじゃない。
(Microsoftは、これらの変更のうち、0x8157、0x815D、0x81FCは従ったけど、残り4つは従わなかったうちの3つはこのU+FF01-U+FF5Eの文字だから――僕の妄想によれば「MicrosoftがASCIIの半角・全角変換用に用意した文字だから」従わなかったのでしょう。……残る0x8161はなんだろう?)
他にもU+FF61-U+FF9Fには半角カナが入っていたりU+FFE0-U+FFE5に他で割り当てられているっぽい全角記号が入っていたりして、どうも実装上の都合(何らかの事情で全角・半角をきちんと分けなければいけない)っぽい感じがします*8。
……このへんの事情って想像するしかないんだけど、どこかで説明されてたりするんでしょうかね。