StringComparison.InvariantCulture 澄清?
Posted
技术标签:
【中文标题】StringComparison.InvariantCulture 澄清?【英文标题】:StringComparison.InvariantCulture Clarification? 【发布时间】:2013-07-30 11:41:55 【问题描述】:根据 MSDN:StringComparison.InvariantCulture
:
指定 String.Compare 的某些重载要使用的区域性、大小写和 排序 规则 String.Equals 方法。
好吧,我没有在我的示例中进行 任何 排序,而且仍然不明白为什么它会产生它产生的结果:
/*1*/ void Main()
/*2*/
/*3*/ string s1 = "lasst";
/*4*/ string s2 = "laßt";
/*5*/ Console.WriteLine (s1.Equals(s2, StringComparison.InvariantCulture));
/*6*/ //True
/*7*/
/*8*/
/*9*/
/*10*/ string s3 = "hello";
/*11*/ string s4 = "héllo";
/*12*/ Console.WriteLine (s3.Equals(s4, StringComparison.InvariantCulture));
/*13*/ //False
/*14*/
InvariantCulture
使用基于english的比较规则,但没有任何地区差异
1) 那么为什么它说 lasst
等于 laßt
呢? (一个甚至没有英文字符...)
2) 为什么(如果它是英文)hello
不等于héllo
?
【问题讨论】:
这不是“扁平化为英语”——只是规则基于英语。我认为有关更多详细信息,您可能应该查看 unicode.org,它可能会详细介绍 很多。 @JonSkeet Jon,但是ß
不是英文字符,那么它怎么能基于英文呢?
“基于”!=“完全一样”。
【参考方案1】:
CLR via C#一书中的相关sn-p
注意 当 Compare 方法不执行序数比较时, 它执行字符扩展。字符扩展是当一个 无论文化如何,字符都会扩展到多个字符。在 在上述情况下,德语 Eszet 字符“ß”始终扩展为 'ss.' 同样,'Æ' 连字字符总是扩展为 “AE。”所以在代码示例中,第二次调用 Compare 将始终 无论我实际传递的是哪种文化,都返回 0。
您的字符串“héllo”不会在内部通过字符扩展进行转换,因此不被视为等于“hello”。
【讨论】:
谢谢 让我看看我是否明白了:ß
字符听起来像ss
,所以有一个内部规则扩展为ss
,这就是它相等的原因。并且é
没有扩展它的规则(它不可扩展---- p.s. 为什么?因为它听起来不一样?)这就是为什么它不同?
听起来像ss
,所以有一个内部规则 - 当然不是,这个规则在德国习俗中根深蒂固。
@HenkHolterman 我不明白 - .net 中的确切部分表明“‘ß’总是扩展为‘ss’。” ?
我认为 Chris 只是在这里引用了它。可惜没有链接(还)。
@Royi Namir,您必须向讲德语的人询问“ß”和“ss”的等价性,因为不幸的是,我只有上面引用的文字作为我的回答的依据。我尝试深入研究 CompareTo 方法以查看是否可以找到此字符扩展发生的位置,但在遇到对 InternalCompareString 的本机调用之前无法看到它。以上是关于StringComparison.InvariantCulture 澄清?的主要内容,如果未能解决你的问题,请参考以下文章