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

M-J*_*-JM 5 c# .net-4.7.2 .net-5

我有以下代码行:

\n
String.Equals("strasse", "stra\xc3\x9fe", StringComparison.InvariantCultureIgnoreCase)\n
Run Code Online (Sandbox Code Playgroud)\n

.net 4.7.2中,这返回 true。
\n在 .net 5 (和.net 6)中,这将返回 false。

\n

为什么?

\n
\n

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

\n

当使用重载方法String.Equals(string,string,Stringcomparison) 将 string :"strasse"和 string :"stra\xc3\x9fe"与以下 Stringcomparison 进行比较时:

\n
Console.WriteLine(String.Equals("strasse", "stra\xc3\x9fe", StringComparison.OrdinalIgnoreCase));\nConsole.WriteLine(String.Equals("strasse", "stra\xc3\x9fe", StringComparison.CurrentCultureIgnoreCase));\nConsole.WriteLine(String.Equals("strasse", "stra\xc3\x9fe", StringComparison.InvariantCultureIgnoreCase));\n
Run Code Online (Sandbox Code Playgroud)\n

我得到以下结果:

\n
False \nFalse\nFalse\n
Run Code Online (Sandbox Code Playgroud)\n

我预计第一行返回 false,但第二行和第三行都返回 true。\n我首先考虑的是我的 CurrentCulture 可能是问题所在,所以可以肯定的是,将 CurrentCulture 和 CurrentUICulture 都设置为:

\n
CultureInfo.DefaultThreadCurrentCulture = CultureInfo.CreateSpecificCulture("de-DE");\nCultureInfo.DefaultThreadCurrentUICulture = CultureInfo.CreateSpecificCulture("de-DE");\n
Run Code Online (Sandbox Code Playgroud)\n

我是否错误地理解了字符串比较?或者我在这里遗漏了一些明显的东西?

\n

预先感谢任何愿意帮助我理解的人

\n

Pie*_*ier 2

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

然而,其他平台的情况并非如此。

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

因此,.Net Core 5 切换到ICU库作为一项重大更改。您可以找到有关在 Windows 上使用 ICU 库的全球化 API的更多信息。ICU库可用于多种语言并且可以互操作,从而实现更好的集成。