コンテンツへスキップ
ものがたり
戻る

2005-06-08

ChrisInglesComeBack…

そろそろ新しいリリースが出るとゆーのに、またリリースノートに書くことが何も無い。忸怩たる思いである。そんなことを言っていたらJIT最適化ハッカーのMassiもHSSAに取りかかりっきりで書くことがないという。彼の仕事はいつも大技だからなあ。

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なんて使っているハンガリー語は滅多にないよ」と言われてしまった。え〜!? ハンガリー人が知らないくらいマニアックなのか…

Footnotes

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


この記事を共有:

前の記事
Hungarian thought
次の記事
どのバージョンなんだー