4

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

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

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

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

示例:这两个词strasse和在德语中straße具有相同的含义。因此,在比较表示德语单词的字符串的上下文中,必须考虑这个语法规则并且这两个字符串必须被认为是相等的(想想德国市场的应用程序,其中用户输入街道名称并且街道必须在数据库中搜索,才能得到街道所在的城市)。street

到目前为止,一切都很好。

鉴于所有这些,在哪些情况下使用 .NET不变文化来实现字符串相等是有意义的?

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

我知道不变文化通常用于格式化和解析机器对机器通信场景中使用的字符串(例如 Web API 公开的合约)。

我想了解调用string.equalsusingStringComparison.InvariantCulture而不是StringComparison.CurrentCulture(对于某些手动设置的线程文化,以便不依赖于机器操作系统配置)真的很有意义。

4

1 回答 1

4

结合变音符号/非规范化字符串就是一个例子。请参阅此答案以获得使用代码的体面处理:https ://stackoverflow.com/a/31361980/2701753

总之,对于(许多)“字母表”,同一个字形(字母)有几种潜在的 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(对于一些手动设置的线程文化,为了不依赖机器操作系统配置)

除了不变文化?

于 2020-05-11T22:20:50.853 回答