ものがたり(旧)

atsushieno.hatenablog.com に続く

CJK character order

漢字のソート順序まわりは面白いというかややこしいというか。

UnicodeでCJK統合漢字領域(0x4E00-0x9FFF)にあたる文字は(たぶん)ほぼ全て意味のある文字*1なので、それぞれ1文字ごとにSortKeyをdumpすると、それがそのまま文字の順序を決めていると考えて問題ない(はずだ)。

で、この文字の順序は、cultureごとに異なるのだけど、特にデフォルト*2と根本的に異なるものが4つある: (1)ja (2)kr (3)zh-CHS (4)zh-TW

そもそも何でそんなに文字の順序が違うの?という話があるのだけど、Unicodeは例によって単なる寄せ集めなので、同じ文字と見なされたものはてきとーにまとめられているのである。
JISコードでは、第一水準の漢字は0x3021からアイウエオ順になっている。CompareInfoのSortKeyが返す値は、Unicodeのcodepoint順ではなく、このJISコードのコードポイント順に従っているのだ。もちろんCJK統合漢字には日本語に存在しない文字がたくさんあるので、それらについてはInvariantCultureと同じ扱いになっている。

日本語について上記のことを確認するには、unicode.orgにあるCP932.txt*3の中を見て、マッピングが存在するものと存在しないものとで違いがあることを確認した。たとえばこのテキストの中にUnicodeの丂(4E02)に対応するマッピングは存在しない。マッピングが存在しない文字は、InvariantCultureと同じ扱いだ。

同じようなことが、韓国語に対応するCP949.txtについても言えそうなのだけど、ちゃんと見ていないのでよく分からない。

それと、中国語についてはまだよく分からない。中国語の文字順序には発音ベースのものと、画数ベースのものの2種類が存在していて、Developing International Softwareによれば、中華人民共和国(zh-CHS)では発音ベース、台湾(zh-TW)や香港(zh-HK)では画数ベースであるようなのだけど、じゃあそれぞれ何をベースにしているのか、それがまだ分からない。この辺は日中共同戦線(何と戦ってるんだ?)を結んでいるDuncanに見てもらった方が早いかもしれないけど、ここまでたどり着いてもらうまでにだいぶかかるというか説明する方が時間がかかる気もする。

例の文字符号の歴史を眺めてみると、けっこうこの辺は興味深い話が書かれている。たとえば北朝鮮euc-krやiso-2022-krで使われているKS X 1001ファミリーとは違うKPS 9566なんてものを持っていて、この中では「金日成」・「金正日」だけ特別なマッピングをもっている、とか(w

*1:primary weightのある文字

*2:まあInvariantCultureとする

*3:まあ本当はShiftJis.txtなどを調べるべきなのだけど