C# 中的默认字符串比较忽略“_”和“0”的 ASCII 顺序,并给出与 Java 相反的结果

Default string comparison in C# disregards ASCII order of "_" and "0" and gives result opposite to Java

当我将程序从 Java 转换为 C# 时,我注意到在某些情况下字符串比较的行为似乎有所不同:

在Java

System.out.println("_".compareTo("0")); // prints 47, "_" is larger than "0"

在 C# 中

Console.WriteLine("_".CompareTo("0")); // prints -1, "_" is smaller than "0"

有谁知道为什么 C# 认为“_”(下划线)小于“0”,而 Java 做相反的事情(这对我来说更有意义,因为它符合 ASCII 顺序)?

更新

感谢大家指出序数比较。

Console.WriteLine(String.CompareOrdinal("_","0")); // prints 47, ordinal comparison does return the result reflecting ASCII

我检查了文档并意识到 CompareTo 是“区分文化和区分大小写的比较”而不是“序数”(https://docs.microsoft.com/en-us/dotnet/api/system.string.compareto?view=net-5.0#remarks) .这可能会有所作为。

Java 与 c# 中的 'ordinal' 比较相同。

java documentation 表示 'It compares strings on the basis of Unicode value of each character in the strings.'

对于非代理 unicode 字符,这与 c# 中的 string.CompareOrdinal 相同,它“通过计算每个字符串中相应 Char 对象的数值来比较两个 String 对象。”

我不确定它们对于高 unicode 代码点(代理项对)是否相同,但我怀疑它们可能是相同的,因为 Java 和 c# 使用 16 位 char 类型。

'standard' c# string.Compare 另一方面,执行 'culture-sensitive' 比较。这意味着它 'uses the current culture to obtain culture-specific information such as casing rules and the alphabetic order of individual characters'。 您可以在 System.Globalization.CompareOptions.

的文档中阅读更多相关信息