我什么时候应该使用 StringComparison.InvariantCulture 而不是 StringComparison.CurrentCulture 来测试字符串相等性?

When should I use StringComparison.InvariantCulture instead of StringComparison.CurrentCulture to test string equality?

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

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

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

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

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

到目前为止,还不错。

考虑到所有这些,在哪些情况下使用 .NET 不变区域性 字符串 equality 有意义?

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

我知道不变区域性通常用于格式化和解析机器对机器通信场景中使用的字符串(例如网络公开的合同API ).

我想了解在调用 string.equals 时使用 StringComparison.InvariantCulture 而不是 StringComparison.CurrentCulture(对于某些手动设置的线程文化,为了不依赖于机器 OS 配置)真的很有意义。

组合变音符号/非规范化字符串就是一个例子。请参阅此答案以使用代码进行体面的处理:

总而言之,对于(许多)'alphabets',同一个字形(字母)有几种潜在的 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 规范化/分解以获取更多信息。

还有其他有趣的情况,例如连字。从左到右和从右到左的标记和....

因此,总而言之,一旦您使用了 'interesting' 个字母表(纯 ascii 之外的几乎所有内容),一旦您对将字符串作为语言项目/字形流进行任何类型的比较感兴趣,您可能确实想要超越序数比较。

直接回答问题:如果您拥有多元文化的用户群,但仍需要上述语言敏感性,您会选择哪种文化:

StringComparison.CurrentCulture (for some manually set thread culture, in order to not depend on the machine OS configuations)

与 InvariantCulture 不同?