ものがたり(旧)

atsushieno.hatenablog.com に続く

どのバージョンなんだー

CompareInfo.Compare()で無視される文字は、既に洗い出し終えたのだけど、そもそも一体これらは何なのかを調べている。が、何となく分かってきた気がする。とりあえず.NETで使われているUnicodeのバージョンは:

で、おそらくCompareInfo.Compare()で無視される文字というのは、単純にUnicodeCategoryで言えばFormatとOtherNotAssignedの2種類だけなのだろう、と推測している。Char.GetUnicodeCategory()で返ってくる値とあまりにも違うのは、それだけ古いマッピングをLCMapStringがもっているということだ。実際

0x01F6 <= i && i <= 0x01F9
0x0218 <= i && i <= 0x0233
0x02A9 <= i && i <= 0x02AD
0x02EA <= i && i <= 0x02EE
0x0349 <= i && i <= 0x036F
0x0488 <= i && i <= 0x048F

(コードの抜粋なので変なのはしょうがないとして)この範囲に含まれる文字は完全に無視されるのだけど(UnicodeCategoryはバラバラ)、この範囲の文字はUnicode 1.1以降3.1までで追加された文字であるようだ*2

おそらくIgnoreNonSpaceはNonSpacingMarkに、IgnoreSymbolsはXXXSymbolに、それぞれ(Unicode 1.0のマッピングに基づいて)対応していたのだろう。

じゃあ実際にはどうやって無視される文字・無視されない文字を識別すればいいのか? 知りません。Unicode Character Databaseと格闘すれば良いんじゃないか、っていう気もするけど、根性で頑張ってねとしか言いようがない。

*1:例によって時系列的にUnicode 2.0以降というのはあり得ない。

*2:Unicode Character DatabaseのDerivedAge.txtを見て確認。