Hungarian thought
今週は(ようやく)言語に依存するソーティングデータを(とりあえず)UCA用にLDMLで書かれたCLDRから取り出す作業をやっている。取り出す作業は出来たけど、難しいのはこれを標準のsortkeyテーブルにマッピングする作業だったりする。というか正しい方法を見いだせたような気がしない。
そんなわけで、ハンガリー語を試してみた。CLDRによると、ハンガリー語では"zs"や"zzs"が特別に扱われるらしい。↓のような定義が含まれている*1:
さっそくCompareInfoで大小比較してみよう: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
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うん、なっているようだ。sortkeyはどうなっているのだろうか?
1
1
1
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…ん? 何か"zzs"のsortkeyは"zs"が単に2つ繰り返されているのと同じように見えるんだけど…
0E B1 0E B1 01 01 01 01 00
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うーん、やっぱり違うらしいが…。どうすりゃいいんだ。 その後Zoltanに聞いてみたら「知らない。zzsなんて使っているハンガリー語は滅多にないよ」と言われてしまった。え〜!? ハンガリー人が知らないくらいマニアックなのか…
-1