c# - 为什么字符串 "\u0022"以这个字符串 "\u204D"开头

标签 c# .net unicode string-comparison

为什么在 .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/

相关文章:

c# - 获取类的 XmlRoot

c# - 从 XElement 读取文本内容

c# - VB .Net 等价于 yield break;

c# - Visual Studio 2015 封装字段

javascript - 如何可靠地去除破坏代码的不可见字符?

c# - 在Azure API for VM中,是否有一种方法可以用一种方法定义许多现有的数据磁盘?

c# - AutoFixture 可以通过约定注册接口(interface)吗?

c# - 传递给 MVC Controller 的 id 总是映射为 0

java - 如何在 Java 中将 "i"与土耳其语 i 匹配?

c# - 将日期格式 01-Feb-17 转换为 01-FEB-17