C# StringComparison.InvariantCulture澄清?

C# StringComparison.InvariantCulture澄清?,c#,string,unicode,invariantculture,C#,String,Unicode,Invariantculture,根据MSDN:StringComparison.InvariantCulture: 指定字符串的某些重载要使用的区域性、大小写和排序规则。比较和 String.Equals方法 在我的样本中,我没有做任何排序,仍然不明白为什么会产生这样的结果: /*1*/ void Main() /*2*/ { /*3*/ string s1 = "lasst"; /*4*/ string s2 = "laßt"; /*5*/ Console.WriteLin

根据MSDN:
StringComparison.InvariantCulture

指定字符串的某些重载要使用的区域性、大小写和排序规则。比较和 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
使用基于英语的比较规则,但没有任何地区差异

1) 那么为什么它说
lasst
等于
laßt
?(一个人甚至没有英文字符…)


2) 为什么(如果它是扁平的英语)
hello
不等于
héllo

通过C#

注意当比较方法不执行顺序比较时, 它执行字符扩展。字符扩展是指 字符扩展为多个字符,与文化无关。在里面 在上述情况下,德语Eszet字符“ß”总是扩展为 类似地,“Æ”连字字符总是扩展到 因此在代码示例中,第二个比较调用将始终 返回0,无论我实际传入哪个区域性


您的字符串“héllo”不会在内部通过字符扩展进行转换,因此被认为不等于“hello”。

通过C从CLR一书中获得的相关片段#

注意当比较方法不执行顺序比较时, 它执行字符扩展。字符扩展是指 字符扩展为多个字符,与文化无关。在里面 在上述情况下,德语Eszet字符“ß”总是扩展为 类似地,“Æ”连字字符总是扩展到 因此在代码示例中,第二个比较调用将始终 返回0,无论我实际传入哪个区域性


字符串“héllo”在内部不会通过字符扩展进行转换,因此被认为不等于“hello”。

它不是“扁平化为英语”-只是规则基于英语。我想更多的细节你应该看看unicode.org,它可能会详细介绍一下。@JonSkeet-Jon,但是
ß
不是英文字符,那么它怎么能基于英文呢?“基于”!=“完全一样”。这不是“扁平化为英语”——只是规则是基于英语的。我想更多的细节你应该看看unicode.org,它可能会详细介绍一下。@JonSkeet-Jon,但是
ß
不是英文字符,那么它怎么能基于英文呢?“基于”!=“与完全相同”。谢谢,让我看看我是否得到了它:
ß
字符听起来像
ss
,所以有一个内部规则扩展为
ss
,这就是它相等的原因。而且,
é
没有一个规则可以扩展它(它是不可扩展的——p.s.为什么?因为它听起来不一样?)这就是它不同的原因?听起来像
ss
所以有一个内部规则-当然不是,这条规则在德国的习俗中根深蒂固。@HenkHolterman我不理解它-在.net中到底是哪一部分表明“ß”总是扩展为“ss”?我想Chris刚才在这里引用了它。遗憾的是,目前还没有链接。@Royi Namir,你必须向一位德语人士询问“ß”和“ss”的等价性,因为我只引用了上面的文本,不幸的是,我的答案是错误的。我试着通过CompareTo方法向下搜索,看看是否能找到角色扩展的位置,但是在我遇到对InternalCompareString的本机调用之前,我看不到它。谢谢,让我看看我是否得到了它:
ß
char听起来像
ss
,所以有一个内部规则扩展为
ss
,这就是它相等的原因。而且,
é
没有一个规则可以扩展它(它是不可扩展的——p.s.为什么?因为它听起来不一样?)这就是它不同的原因?听起来像
ss
所以有一个内部规则-当然不是,这条规则在德国的习俗中根深蒂固。@HenkHolterman我不理解它-在.net中到底是哪一部分表明“ß”总是扩展为“ss”?我想Chris刚才在这里引用了它。遗憾的是,目前还没有链接。@Royi Namir,你必须向一位德语人士询问“ß”和“ss”的等价性,因为我只引用了上面的文本,不幸的是,我的答案是错误的。我尝试深入研究CompareTo方法,看看是否可以找到角色扩展的位置,但在遇到对InternalCompareString的本机调用之前,我看不到它。