どのバージョンなんだー
CompareInfo.Compare()で無視される文字は、既に洗い出し終えたのだけど、そもそも一体これらは何なのかを調べている。が、何となく分かってきた気がする。とりあえず.NETで使われているUnicodeのバージョンは:
- UnicodeEncoding: MSDNによるとUnicode 2.0
- UnicodeCategory: MSDNによるとUnicode 3.1
- CompareInfo.Compare(): たぶんUnicode 1.0 *1
で、おそらく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と格闘すれば良いんじゃないか、っていう気もするけど、根性で頑張ってねとしか言いようがない。