为什么带有 InvariantCultureIgnoreCase 的 String.Equals 在 .net 4.7.2 和 .net 5 中表现不同?

Why does String.Equals with InvariantCultureIgnoreCase behave different in .net 4.7.2 and .net 5?

我有下面一行代码:

String.Equals("strasse", "straße", StringComparison.InvariantCultureIgnoreCase)

.net 4.7.2 中,这 return 是正确的。
在 .net 5(和 .net 6)中,这个 return 是错误的。

为什么?


我目前正在学习如何在 C# 中比较字符串。网。并遇到了一个我不完全理解的意外结果。

当使用重载方法 String.Equals(string,string,Stringcomparison) 比较字符串 :"strasse" 和字符串 : "straße" 与以下字符串比较 :

Console.WriteLine(String.Equals("strasse", "straße", StringComparison.OrdinalIgnoreCase));
Console.WriteLine(String.Equals("strasse", "straße", StringComparison.CurrentCultureIgnoreCase));
Console.WriteLine(String.Equals("strasse", "straße", StringComparison.InvariantCultureIgnoreCase));

我得到以下结果:

False 
False
False

我预计第一行 return 为假,但第二行和第三行都为 return 真。 我首先虽然可能是我的 CurrentCulture 是问题所在,但可以肯定的是,CurrentCulture 和 CurrentUICulture 都为 :

CultureInfo.DefaultThreadCurrentCulture = CultureInfo.CreateSpecificCulture("de-DE");
CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.CreateSpecificCulture("de-DE");

我对字符串比较的理解有误吗?还是我在这里遗漏了一些明显的东西?

提前感谢任何愿意帮助我理解的人

当您以 .NET Framework 4.x 为目标时,您隐式地以 Windows 平台为目标。 Windows 平台以其特定方式处理 Unicode 和文化,这是过去 30 年平台发展的直接副产品。 Windows 平台的标准是使用 NLS Apis。

但是,其他平台的情况并非如此。

在过去的几年里,ICU project 试图提供一个统一的、事实上的标准来处理 Unicode 字符(以及更多)。由于 .NET Core 按照设计在 Windows、Linux、Mac 和(可能)Android 设备上运行,您希望您的应用程序无论在哪个平台上运行都能够保持一致的行为

出于这个原因,.Net Core 5 切换到 ICU libraries as a breaking change. You can find more information on Globalization APIs use ICU libraries on Windows. ICU 库可用于多种语言并且可以互操作,从而实现更好的集成。