为什么在 .net (Windows 8) 下这个字符串比较返回 true?
"\u0022".StartsWith("\u204D");
这在所有文化中都是正确的,如果您将 StartsWith 切换为 Equals,它会返回 false。
对于 StartsWith 比较,有许多不同的字符返回 true。这是奇怪的 Unicode 规则的一部分,还是 Windows 在这里有自己的规则?
最佳答案
了解依赖于文化的字符串比较的规则并不容易。标点符号 U+0022 "
(QUOTATION MARK) 和 U+204D ⁍
(BLACK RIGHTWARDS BULLET) 在文化比较下被认为是“足够平等”(包括不变文化的那些)。这些例子都表明:
// culture-sensitive:
Console.WriteLine("\"".StartsWith("⁍"));
Console.WriteLine("⁍".StartsWith("\""));
Console.WriteLine("\"".StartsWith("⁍", StringComparison.InvariantCulture));
Console.WriteLine("⁍".StartsWith("\"", StringComparison.InvariantCulture));
Console.WriteLine("\"".Equals("⁍", StringComparison.CurrentCulture));
Console.WriteLine("⁍".Equals("\"", StringComparison.CurrentCulture));
Console.WriteLine("\"".Equals("⁍", StringComparison.InvariantCulture));
Console.WriteLine("⁍".Equals("\"", StringComparison.InvariantCulture));
Console.WriteLine(StringComparer.CurrentCulture.Equals("\"", "⁍"));
Console.WriteLine(StringComparer.CurrentCulture.Equals("⁍", "\""));
Console.WriteLine(StringComparer.InvariantCulture.Equals("\"", "⁍"));
Console.WriteLine(StringComparer.InvariantCulture.Equals("⁍", "\""));
Console.WriteLine("\"".CompareTo("⁍"));
Console.WriteLine("⁍".CompareTo("\""));
Console.WriteLine(StringComparer.CurrentCulture.Compare("\"", "⁍"));
Console.WriteLine(StringComparer.CurrentCulture.Compare("⁍", "\""));
Console.WriteLine(StringComparer.InvariantCulture.Compare("\"", "⁍"));
Console.WriteLine(StringComparer.InvariantCulture.Compare("⁍", "\""));
可以给出其他示例,例如 string
上的 static
方法,但它们是等效的。
通过序数比较,U+0022 肯定不同于(小于)U+204D(这很简单!):
// ordinal:
Console.WriteLine("\"".StartsWith("⁍", StringComparison.Ordinal));
Console.WriteLine("⁍".StartsWith("\"", StringComparison.Ordinal));
Console.WriteLine("\"".Equals("⁍"));
Console.WriteLine("⁍".Equals("\""));
Console.WriteLine(StringComparer.Ordinal.Equals("\"", "⁍"));
Console.WriteLine(StringComparer.Ordinal.Equals("⁍", "\""));
Console.WriteLine(StringComparer.Ordinal.Compare("\"", "⁍"));
Console.WriteLine(StringComparer.Ordinal.Compare("⁍", "\""));
关于c# - 为什么字符串 "\u0022"以这个字符串 "\u204D"开头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27974514/