.NET 4.8与6.0中"ß".Equals("SS", StringComparison.CurrentCultureIgnoreCase)结果为何不同?
.NET 4.8与.NET 6.0中德语字符ß与SS的比较差异
以下代码在不同.NET版本中运行结果存在差异:
Thread.CurrentThread.CurrentCulture = new CultureInfo("de-de"); Thread.CurrentThread.CurrentUICulture = new CultureInfo("de-de"); var eq = "ß".Equals("SS", StringComparison.CurrentCultureIgnoreCase); // .NET 4.8中返回True // .NET 6.0中返回False
差异原因
.NET Framework 4.8采用旧版Unicode排序规则,在德语文化(de-de)的大小写不敏感比较逻辑中,会将小写字符ß等价于SS。而.NET 5及后续版本(包括.NET 6)默认使用了更新的Unicode规范,其中ß的标准大写形式为ẞ(大写尖锐S),因此ß与SS不再被判定为相等。
恢复旧行为的方法
如果需要在.NET 6中保持和.NET 4.8一致的比较逻辑,可以指定使用旧版本的ICU排序规则:
var culture = new CultureInfo("de-de"); // 指定使用ICU 60版本排序规则,匹配旧版.NET Framework行为 culture.CompareInfo = CompareInfo.GetCompareInfo("de-de", CompareOptions.None, VersionSortVersion.IcuVersion(60)); Thread.CurrentThread.CurrentCulture = culture; Thread.CurrentThread.CurrentUICulture = culture; var eq = "ß".Equals("SS", StringComparison.CurrentCultureIgnoreCase); // 此时返回True
内容的提问来源于stack exchange,提问作者Voo
相关产品推荐
相关产品推荐

