You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 13:27:37