ものがたり(旧)

atsushieno.hatenablog.com に続く

ICU/UCA/LCMapString

ICUもUCAも使わないWindows固有の文字列比較つまりLCMapString相当のモノを実装するぞ、と言い出してから、Mainsoftの面々が口をばらばらにして(そろえないで)「えーマジ?」という反応を示しているのがなかなかおもしろい。ていうかもともとMigたんがほしがっていたのがMS互換のcollationで、ICUもUCAも実装方式が全然違うのであれば、僕の作業も当然ICUやUCAから離れていくのだけど、重大な内部処理の変更を、僕があまりにもアッサリと決定しているのがこわいようだ(っていうか彼らは僕らのmscorlibは使わないので直接は関係ないんだけど)。

そんなわけでとりあえずCompareInfo.GetSortKey()の戻り値の構造を調べているのだけど、自分でも書いてて理解可能なテキストになってねーなと思っている。

まあそんなわけで、多少はCompareInfo.Compare()というかLCMapString()の中で行われている処理も分かっているような気がする。たとえばIndexOf("xyz\u0301", "xyz") が-1を返すことは説明できる。こいつらのSortKeyのKeyDataはこんな感じだが:


"xyz" : 14 166 14 167 14 169 1 1 1 1 0
"xyz\u0301" : 14 166 14 167 14 169 1 2 2 14 1 1 1 0
それぞれの数値が何であるかはほぼ説明できる。

って、どっかにSortKeyのデータ構造について説明した文書があれば、僕が解析するまでもないんだけど…*1

*1:Wineのコードも見たんだけど、ビミョー