.NET 6使用ICU库时ß与SS大小写比较返回false问题咨询
.NET 6中ICU库下"ß"与"SS"大小写不相等的原因
先看这段C#代码在不同环境下的表现:
Thread.CurrentThread.CurrentCulture = new CultureInfo("de-de"); Thread.CurrentThread.CurrentUICulture = new CultureInfo("de-de"); "ß".Equals("SS", StringComparison.CurrentCultureIgnoreCase); // .NET 6+ ICU环境返回false,旧版NLS返回true
你提到Unicode大小写折叠规则里明确00DF; F; 0073 0073; # LATIN SMALL LETTER SHARP S,按规则和德语正字法,这个比较应该返回true,那为什么ICU下结果相反?
核心原因是ICU的区域化大小写映射逻辑和旧版Microsoft NLS不同,而非ICU违反Unicode标准:
- Unicode的CaseFolding.txt定义的是通用大小写折叠规则,但ICU在处理区域化字符串比较时,会结合对应文化的特定规则。
- 在德语(de-de)文化中,现代正字法引入了大写形式
ẞ(LATIN CAPITAL LETTER SHARP S),ICU遵循了这一区域规则:当使用CurrentCultureIgnoreCase比较时,会将小写ß转换为大写ẞ而非SS,因此"ß"和"SS"的大小写忽略比较自然不相等。 - 旧版NLS未支持这一现代德语正字法的大写规则,直接将
ß映射为SS,所以比较返回true。
如果希望遵循Unicode通用折叠规则而非区域特定规则,可以改用StringComparison.OrdinalIgnoreCase,或者显式使用Unicode通用大小写折叠逻辑处理字符串后再比较。
内容的提问来源于stack exchange,提问作者Voo
相关产品推荐
相关产品推荐

