为什么有些变音符号没有被去除?
Why don't some diacritics get stripped?
我正在使用 this answer 中的方法从单词中删除特殊字符并将它们更改为简单形式。这对许多基本口音非常有效,例如
Malmö becomes "Malmo"
München becomes "Munchen"
Åge becomes "Age"
但是这不适用于其他一些字符,例如:
Strømsgodset remains "Strømsgodset"
Kulħadd remains "Kulħadd"
为什么这些字符没有像其他字符那样转换?
还有什么方法可以类似地转换 'combined' 个字符,例如:
æ -> ae
ẞ -> ss
因为 Unicode Consortium 编写的 Normalization chart 没有您想要的分解,并且 Microsoft 使用了该图表(或者更可能是该图表的文本版本,或者该图表的旧版本,但这些都是细节)。
我不知道原因,因为我不是语言学家,但我确实希望 Unicode 联盟中有足够多的优秀语言学家来做出正确的选择。
请注意,归类表与规范化表是分开的,因此您可以:
int res = string.Compare("æ", "ae", CultureInfo.CurrentCulture, CompareOptions.IgnoreNonSpace);
是 0
... 所以 æ == ae
,并且 ħ == h
您甚至可以 IndexOf
,使用排序规则:
int ix = CultureInfo.CurrentCulture.CompareInfo.IndexOf(
"Ad aeternitatem",
"æter",
CompareOptions.IgnoreNonSpace); // 3
并忽略大小写:
int ix = CultureInfo.CurrentCulture.CompareInfo.IndexOf(
"Ad Aeternitatem",
"æter",
CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase); // 3
我正在使用 this answer 中的方法从单词中删除特殊字符并将它们更改为简单形式。这对许多基本口音非常有效,例如
Malmö becomes "Malmo"
München becomes "Munchen"
Åge becomes "Age"
但是这不适用于其他一些字符,例如:
Strømsgodset remains "Strømsgodset"
Kulħadd remains "Kulħadd"
为什么这些字符没有像其他字符那样转换?
还有什么方法可以类似地转换 'combined' 个字符,例如:
æ -> ae
ẞ -> ss
因为 Unicode Consortium 编写的 Normalization chart 没有您想要的分解,并且 Microsoft 使用了该图表(或者更可能是该图表的文本版本,或者该图表的旧版本,但这些都是细节)。
我不知道原因,因为我不是语言学家,但我确实希望 Unicode 联盟中有足够多的优秀语言学家来做出正确的选择。
请注意,归类表与规范化表是分开的,因此您可以:
int res = string.Compare("æ", "ae", CultureInfo.CurrentCulture, CompareOptions.IgnoreNonSpace);
是 0
... 所以 æ == ae
,并且 ħ == h
您甚至可以 IndexOf
,使用排序规则:
int ix = CultureInfo.CurrentCulture.CompareInfo.IndexOf(
"Ad aeternitatem",
"æter",
CompareOptions.IgnoreNonSpace); // 3
并忽略大小写:
int ix = CultureInfo.CurrentCulture.CompareInfo.IndexOf(
"Ad Aeternitatem",
"æter",
CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase); // 3