Why does the string "\ u0022" begin with this string "\ u204D"

Why in .net (Windows 8) does this string comparison return true?

"\u0022".StartsWith("\u204D"); 

This is true for all cultures, and if you switch StartsWith to Equals, it will return false.

There are many different characters that return true for comparing StartsWith. Is this part of the odd Unicode rule or does Windows have its own rules here?

+5
source share
1 answer

It’s not easy to find out what rules lie within culture-specific string comparisons. It seems quite consistent that when comparing cultures (including invariant culture), punctuation U + 0022 " (QUOTATION MARK) and U + 204D ⁍ (BLACK RIGHTWARDS BULLET) are considered" fairly equal. "All these examples show that:

 // 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("⁍", "\"")); 

Other examples could be given, for example, static methods on string , but they are equivalent.

With ordinal comparison, of course, U + 0022 should be different from (less) U + 204D (it's easy!):

 // 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("⁍", "\"")); 
0
source

Source: https://habr.com/ru/post/1211205/


All Articles