gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 01:26:58 27 4
gpt4 key购买 nike

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

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

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

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

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

到现在为止还挺好。

鉴于所有这些,在这种情况下使用 .NET 不变文化用于字符串 平等说得通 ?

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

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

想了解的时候打电话string.equals使用 StringComparison.InvariantCulture而不是 StringComparison.CurrentCulture (对于一些手动设置的线程文化,为了不依赖于机器操作系统配置)真的很有意义。

最佳答案

组合变音符号/非标准化字符串就是一个例子。请参阅此答案以使用代码进行体面的处理: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 (for some manually set thread culture, in order to not depend on the machine OS configuations)



除了不变文化?

关于c# - 什么时候应该使用 StringComparison.InvariantCulture 而不是 StringComparison.CurrentCulture 来测试字符串相等性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61740030/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com