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のコードも見たんだけど、ビミョー