为什么 StartsWith 仅在我的计算机上返回错误值?

noo*_*yte 6 .net c#

以下代码适用于“所有人”机器,除了我的机器:

var foo = "caa";
var bar = "ca";
if (foo.StartsWith(bar, false, CultureInfo.GetCultureInfo("no")))
    Console.WriteLine($"{foo} starts with {bar}");
else
{
    Console.WriteLine($"{foo} does not start with {bar}");
}
Run Code Online (Sandbox Code Playgroud)

我在 .net 5.0.400、5.0.403、6.0.100 上尝试过 - 所有打印“caa 不以 ca 开头”。我没有从任何地方复制这些字符,而是逐字逐句地输入它们。

我知道这实际上只是在我的计算机上,但我不明白为什么或是什么导致了这种情况。

编辑:我使用的是 Windows 10 - 操作系统内部版本:19043.1348。nb-NO 键盘,en-US Windows UI 语言。

编辑:添加 if (foo.StartsWith(bar, false, CultureInfo.GetCultureInfo("no") - 行为没有变化。

Cod*_*ter 8

重现:

System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("nb-NO");

var foo = "caa";
var bar = "ca";
if (foo.StartsWith(bar))
{
    Console.WriteLine($"{foo} starts with {bar}");
}
else
{
    Console.WriteLine($"{foo} does not start with {bar}");
}
Run Code Online (Sandbox Code Playgroud)

从 .NET 5 开始,字符串比较是使用不同的字符串比较库 (ICU)完成的。在挪威语中,“aa”显然与“a”+“a”不同。请参阅在 .NET 5+ 上比较字符串时的行为变化

比较(感谢@Charlieface):

您需要进行序数(字符数值)比较:

foo.StartsWith(bar, StringComparison.Ordinal)
Run Code Online (Sandbox Code Playgroud)

  • 哦,`"Strasse".EndsWith("ße")` [确实返回 true](https://dotnetfiddle.net/cWMMFm),即使在 en-US 中,但仅限于 .NET < 5。全球化*困难* ... (6认同)