StringComparison.InvariantCulture Clarification?

本文关键字:Clarification InvariantCulture StringComparison | 更新日期: 2023-09-27 18:25:32

根据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

StringComparison.InvariantCulture Clarification?

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

注意当Compare方法不执行顺序比较时,它执行字符扩展。字符扩展是指无论文化如何,角色都会扩展为多个角色。在里面在上述情况下,德语Eszet字符"ß"总是扩展为'ss.'类似地,"Æ"连字字符总是扩展为"啊。"因此,在代码示例中,对Compare的第二次调用将始终返回0,而不管我实际传入的是哪种文化。

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