【问题标题】:Why does String.Equals with InvariantCultureIgnoreCase behave different in .net 4.7.2 and .net 5?为什么 InvariantCultureIgnoreCase 的 String.Equals 在 .net 4.7.2 和 .net 5 中表现不同?
【发布时间】:2021-12-14 01:37:01
【问题描述】:

我有以下代码行:

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

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

为什么?


我目前正在学习如何在 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

我希望第一行返回 false,但第二行和第三行都返回 true。 我首先虽然可能是我的 CurrentCulture 是问题所在,所以可以肯定的是,CurrentCulture 和 CurrentUICulture 都是:

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

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

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

【问题讨论】:

  • 即使没有设置当前的文化,我也只是运行Console.WriteLine(String.Equals("strasse", "straße", StringComparison.InvariantCultureIgnoreCase)); 并打印了True
  • CurrentCulture 结果将取决于线程的文化设置
  • @Bugbeeb 不应该InvariantCultureIgnoreCase 比较给我True,不管我的CurrentCulture 会设置什么?
  • 事实证明,如果我们以框架 5.0 及更高版本为目标,它不会给出我预期的结果。但是,我刚刚使用 .NET 框架 4.7.2 制作了一个新的控制台应用程序,并得到了我期望的确切结果。我查看了 .NET 5 的变化,找不到可以解释差异的东西。有人能指出我正确的方向吗?

标签: c# .net-5 .net-4.7.2


【解决方案1】:

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

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

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

出于这个原因,.Net Core 5 切换到 ICU 库作为一项重大更改。您可以在Globalization APIs use ICU libraries on Windows 上找到更多信息。 ICU 库可用于多种语言并且可互操作,从而实现更好的集成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    • 2013-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多