意外的行为与EndsWith。

14

有人能解释这种行为吗?

" ".EndsWith(((char)9917).ToString()) // returns true

StartsWith的工作方式相同。


1
对于所有想知道的人:这个字符是足球。http://www.fileformat.info/info/unicode/char/26bd/index.htm - usr
1
根据文化信息,该字符等同于空字符串。string.Equals(((char)9917).ToString, "", StringComparison.CurrentCulture)也返回true - Lasse V. Karlsen
2
也适用于9918和9919,但不适用于9916或9920。 - Blorgbeard
1
有趣:“”.Contains(((char)9917).ToString()) //false :-) - dognose
1
"a".EndsWith(((char)9917).ToString()) 也返回 true。正如 @LasseV.Karlsen 指出的那样,该字符等于空字符串,因此它与 'string.EndsWith("")' 相同。 - Doug
显示剩余5条评论
2个回答

3

Windows 7上的.NET Framework 4支持Unicode 5.1:

字符串比较中使用的区域性敏感排序和大小写规则取决于.NET Framework的版本。在.NET Framework 4中,排序、大小写、规范化和Unicode字符信息与Windows 7同步,并符合Unicode 5.1标准。

您使用的字符是Unicode 5.2字符,因此除了那些仅按数字比较字符的函数之外,它可能无法正常工作。

您应该在Windows 8和.NET 4.5上看到不同的行为(但我现在无法测试):根据文档,在这种情况下,支持Unicode 6.0。 根据Thomas Levesque在评论中的说法,与文档相反,这在后续版本中没有改变。


刚在Windows 8.1 / .NET 4.5上尝试了一下:结果是一样的。 - Thomas Levesque

2

如评论中所述,如果没有提供 StringComparison Type,则 endswith 方法使用当前 Culture。

您可以通过使用序数比较来使其工作:

" ".EndsWith(((char)9917).ToString(), StringComparison.Ordinal); //false

(Ordinal 最终将比较字符的 bytes 以确定相等性)


请注意,如果字符串没有规范化,序数比较几乎肯定是错误的,即使它们已经规范化,比较结果也可能不是预期的(或者在其他情况下,可能会得到预期的比较结果)。 - user743382

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接