字符串"\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

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

而且,尽管我觉得这很令人惊讶并且想了解“为什么”,但我同样对如何强制.NET强制仅通过代码点进行搜索感兴趣(使用InvariantCulture似乎无济于事)?

为了进行比较,以下一个字符"\u1FFE:foo".StartsWith(":")返回false。

最佳答案

通常,可以将一个字符串视为以两个不同的字符串开头,而这两个不同的字符串不是逐字节相同的,这并不奇怪(因为Unicode很复杂)。例如,这些结果几乎总是可以反射(reflect)用户的需求:

"n\u0303".StartsWith("\u00f1") // true
"n\u0303".StartsWith("n")      // false

使用System.Globalization.CharUnicodeInfo.GetUnicodeCategory,您可以看到'\u1fff'在“OtherNotAssigned”类别中;我不清楚这是否会影响字符串搜索/排序/比较操作(它似乎不影响规范化,即规范化后仍保留字符)。

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

关于c# - 为什么 "\u1FFF:foo".StartsWith (":")返回true?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47209888/

10-09 03:11