C# 何时应该使用StringComparison.InvariantCulture而不是StringComparison.CurrentCulture来测试字符串相等性?

C# 何时应该使用StringComparison.InvariantCulture而不是StringComparison.CurrentCulture来测试字符串相等性?,c#,.net,string,cultureinfo,invariantculture,C#,.net,String,Cultureinfo,Invariantculture,根据我的理解(请参阅),为了决定是否使用顺序规则或文化规则测试字符串相等性,必须考虑执行比较的语义 如果必须将两个比较的字符串视为原始字符序列(换句话说,两个符号),则必须执行顺序字符串比较。这是在服务器端代码中执行的大多数字符串比较的情况 示例:按用户名执行用户查找。在这种情况下,可用用户的用户名和搜索的用户名只是符号,它们不是特定语言中的单词,因此在比较它们时不需要考虑语言元素在这种情况下,由不同字符组成的两个符号必须被视为不同的,而不考虑任何语言规则。 如果必须将两个比较的字符串视为特定语

根据我的理解(请参阅),为了决定是否使用顺序规则或文化规则测试字符串相等性,必须考虑执行比较的语义

如果必须将两个比较的字符串视为原始字符序列(换句话说,两个符号),则必须执行顺序字符串比较。这是在服务器端代码中执行的大多数字符串比较的情况

示例:按用户名执行用户查找。在这种情况下,可用用户的用户名和搜索的用户名只是符号,它们不是特定语言中的单词,因此在比较它们时不需要考虑语言元素在这种情况下,由不同字符组成的两个符号必须被视为不同的,而不考虑任何语言规则。

如果必须将两个比较的字符串视为特定语言中的单词,那么在比较过程中必须考虑文化规则。根据某种语言的语法规则,完全有可能由不同的字符组成的两个字符串在某种语言中被认为是同一个单词

示例:两个单词
strasse
straße
在德语中与
street
具有相同的含义因此,在比较代表德语单词的字符串时,必须考虑这一语法规则,并且必须将这两个字符串视为相等的(想想德国市场的一个应用程序,其中用户输入一条街道的名称,并且必须在数据库中搜索该街道,以获得该街道所在的城市)

到目前为止,一切顺利

考虑到所有这些,在哪些情况下,对字符串相等性使用.NET不变区域性是有意义的

重点是不变的文化(与上面例子中提到的德国文化相反)是一种基于美式英语语言规则的虚假文化。 换句话说,没有一种人类语言的规则是基于.NET不变区域性的,,那么我为什么要使用这种虚拟区域性来比较两个字符串呢

我知道,不变量区域性通常用于格式化和解析机器对机器通信场景中使用的字符串(例如web API公开的契约)


我想了解使用
StringComparison.InvariantCulture
调用
string.equals
时,与
StringComparison.CurrentCulture
相反(对于某些手动设置的线程区域性,为了不依赖于机器操作系统配置)真的很有意义。

结合变音符号/非标准化字符串就是一个例子。有关代码的合理处理,请参见以下答案:

总之,对于(许多)“字母表”,同一字形(字母)有几种可能的Unicode(和UCS-2)表示法

例如:

Unicode Character “á” (U+00E1) [one unicode codepoint]
Unicode Character “a” (U+0061) [followed by] Unicode Character “◌́” (U+0301) [two unicode codepoints]

so:
á
á
相同的语言字符串(对于所有区域性,它们应该表示相同的字符),但不同的顺序字符串(不同的字节)

所以不变相等比较[在本例中]类似于在比较字符串之前对字符串进行归一化

有关更多信息,请查阅unicode规范化/分解

还有其他有趣的例子,比如连字,从左到右,从右到左的标记和

总之,一旦你有了“有趣的”字母表(几乎是纯ascii之外的任何东西),一旦你对字符串作为语言项目/字形流的任何形式的比较感兴趣,你可能想超越顺序比较

直接回答以下问题:如果您拥有多文化用户群,但仍然需要上述语言敏感性,您会选择什么文化:

StringComparison.CurrentCulture
(对于某些手动设置的线程区域性,为了不依赖于机器操作系统配置)


除了不变量文化之外?

strasse和straße是否相等是域的函数,而不是.net甚至是C#。在某些情况下,您需要计算
(strasse==straße)=true
,以及
的时间(strasse==straße)==false
。您的业务逻辑应该决定如何比较字符串…@AustinFrench完全同意您的观点。这是在顺序字符串比较和区域性感知字符串比较之间进行选择时使用的基本原理。我的问题是,是否使用不变区域性而不是特定区域性(en-gb、fr-fr、ecc…)对于区分区域性的字符串比较来说非常有意义。不变量文化是对“如果每个人的做法都不同,那么标准是什么”这一问题的简单回答如果您有一个配置文件,可以为用户可以更改的浮点数指定默认值,那么您可能会很喜欢它。因为在部署该文件时,您永远无法正确猜测该用户是否使用逗号或小数点,因此您必须选择一个标准。方便。确保用户在更改该文件时能够清楚地看到,我们即使你不需要它,也要考虑这样一种情况,即你有一个字段代表程序已知的名字,而不是在UI中暴露出来。这个名字将是不变的,而不是你将要本地化的东西,当然你可能需要自己滚动,所以简单地说,无论何时语言敏感,都必须使用不变的文化。字符串比较需要活动性,但不可能确定特定的语言,因为不可能假设所有用户都使用相同的语言。因此,当存在歧义时,使用文化是一种常规选择。