字符串"\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.
一般来说,一个字符串可能被认为是以两个不是逐字节相同的字符串开头,这并不奇怪(因为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.