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 澄清?的主要内容,如果未能解决你的问题,请参考以下文章