为什么在.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 方法,但它们是等效的 .
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("⁍", "\""));
1 回答
要知道依赖于文化的字符串比较有哪些规则并不容易 . 在文化比较(包括不变文化的那些)下,标点符号U 0022
"
(QUOTATION MARK)和U 204D⁍
(BLACK RIGHTWARDS BULLET)被认为是非常一致的 . 这些例子都表明:可以给出其他示例,例如
string
上的static
方法,但它们是等效的 .通过序数比较,肯定U 0022必须与(小于)U 204D不同(这很简单!):