为什么"\ u1FFF:foo".StartsWith(":")返回true?

Abe*_*bel 8 .net c# clr f#

字符串"\u1FFF:foo"\u1FFF(或"῿")开头,对吧?

那么这两者怎么可能都是真的呢?

"\u1FFF:foo".StartsWith(":")       // equals true
"\u1FFF:foo".StartsWith("\u1FFF")  // equals true

// alternatively, the same:
"?:foo".StartsWith(":")           // equals true
"?:foo".StartsWith("?")          // equals true
Run Code Online (Sandbox Code Playgroud)

.NET是否声称此字符串以两个不同的字符开头?

虽然我发现这非常令人惊讶,并且想要理解"为什么",但我同样对如何强制.NET仅通过代码点进行搜索感兴趣(使用InvariantCulture似乎没有做任何事情)?

为了比较,下面的一个字符"\u1FFE:foo".StartsWith(":")返回false.

kvb*_*kvb 9

一般来说,一个字符串可能被认为是以两个不是逐字节相同的字符串开头,这并不奇怪(因为Unicode很复杂).例如,这些结果几乎总是反映用户想要的内容:

"n\u0303".StartsWith("\u00f1") // true
"n\u0303".StartsWith("n")      // false
Run Code Online (Sandbox Code Playgroud)

使用System.Globalization.CharUnicodeInfo.GetUnicodeCategory,您可以看到它'\u1fff'位于"OtherNotAssigned"类别中; 我不清楚这是否应该影响字符串搜索/排序/比较操作(它似乎不会影响规范化,也就是说,标准化后字符仍然存在).

如果要进行逐字节比较,请使用StringComparison.Ordinal.