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
.
的文档中阅读更多相关信息
当我将程序从 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
.