2006-06-05

JIS系とCP932系の相互変換

 現状で問題になっている(気がする)のはJIS系とCP932系のUnicodeマッピングが非互換だかららしくて、sjis同士*1euc-jp同士*2だと(あまり)問題がなくても、Unicodeに変換しちゃうとそれぞれお互いに変換できなくなる。らしい。

 であれば、

  1. Unicodeマッピングに無いものでもレガシーエンコーディングにするときは変換しちゃうようにする
  2. 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の文字だから――僕の妄想によれば「MicrosoftASCIIの半角・全角変換用に用意した文字だから」従わなかったのでしょう。……残る0x8161はなんだろう?)

 他にもU+FF61-U+FF9Fには半角カナが入っていたりU+FFE0-U+FFE5に他で割り当てられているっぽい全角記号が入っていたりして、どうも実装上の都合(何らかの事情で全角・半角をきちんと分けなければいけない)っぽい感じがします*8

 ……このへんの事情って想像するしかないんだけど、どこかで説明されてたりするんでしょうかね。

*1Shift_JISとCP932。

*2EUC-JPとeucJP-ms

*3レガシーエンコーディング対策本部メーリングリストでこういう主張は見なかった気がする。見逃してるかな?

*4:勝手に変換されると問題があるだろうから、反対するのは正しい。

*5:個人的にはPerlのモジュールがあればとりあえず問題は解決するんだけれど。

*6:それとも日本以外でも「全角」って言うんだろうか? あれは日本の組版からきた呼び名だと思ってたんだけど。

*7:もちろん同じ主張はMicrosoft以外もする可能性はある。

*8:U+FF00-U+FFFFの残りの部分は韓国向けの記号っぽいけど、韓国のコードが分からないのであの配置だと実装がしやすいのかはちょっと分からない。