ものがたり(旧)

atsushieno.hatenablog.com に続く

Hungarian thought

今週は(ようやく)言語に依存するソーティングデータを(とりあえず)UCA用にLDMLで書かれたCLDRから取り出す作業をやっている。取り出す作業は出来たけど、難しいのはこれを標準のsortkeyテーブルにマッピングする作業だったりする。というか正しい方法を見いだせたような気がしない。

そんなわけで、ハンガリー語を試してみた。CLDRによると、ハンガリー語では"zs"や"zzs"が特別に扱われるらしい。↓のような定義が含まれている*1:

Z
<p>zs</p>
<t>Zs</t>
<t>ZS</t>
zs
<t>zzs</t>zs
Zs
<t>Zzs</t>zs
ZS
<t>ZZS</t>ZS
さっそくCompareInfoで大小比較してみよう:
Console.WriteLine (hu.Compare ("zs", "zt"));
Console.WriteLine (hu.Compare ("zs", "za"));
Console.WriteLine (inv.Compare ("zs", "zt"));
Console.WriteLine (inv.Compare ("zs", "za"));
結果は…
 -1
 1
 1
 1
うん、なっているようだ。sortkeyはどうなっているのだろうか?
foreach (byte b in hu.GetSortKey ("zs").KeyData)
    Console.Write ("{0:X02} ", b);
Console.WriteLine ();
foreach (byte b in hu.GetSortKey ("zzs").KeyData)
    Console.Write ("{0:X02} ", b);
Console.WriteLine ();
0E B1 01 01 01 01 00
0E B1 0E B1 01 01 01 01 00
…ん? 何か"zzs"のsortkeyは"zs"が単に2つ繰り返されているのと同じように見えるんだけど…
Console.WriteLine (hu.Compare ("zszs", "zzs"));
 0
あちゃぁ。 いや、もしかしたらそれが正しいハンガリーの文字列比較なのかもしれない。ネイティブのlpszZoltanに聞いてみれば分かるだろうけど、今は日本の真っ昼間でまだ寝ている。そんなわけでTigerにおうかがいを立ててみた:
Collator coll = Collator.getInstance();
System.out.println (coll.compare("zzs", "zszs"));
coll = Collator.getInstance(new Locale ("hu"));
System.out.println (coll.compare("zzs", "zszs"));
 1
 -1
うーん、やっぱり違うらしいが…。どうすりゃいいんだ。 その後Zoltanに聞いてみたら「知らない。zzsなんて使っているハンガリー語は滅多にないよ」と言われてしまった。え〜!? ハンガリー人が知らないくらいマニアックなのか…

*1:実はLDMLの仕様を読む限りでは、後段のzs/zzsの部分は、resetとextend双方にzsが含まれているので、対象文字列はzszsなのではないか(つまりこのマークアップおかしいんじゃん?)と思うのだが、あまり自信は無い。