我何时应该使用StringComparison.InvariantCulture代替StringComparison.CurrentCulture来测试字符串相等性?

问题描述 投票:1回答:1

基于我的理解(请参阅my other question,为了决定是否通过使用序数或文化规则来测试字符串相等性,必须考虑执行的比较的语义

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

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

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

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

到目前为止,很好。

给出所有这些,在什么情况下将.NET invariant culture用于字符串equality是有意义的?

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

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

我想了解使用string.equals而不是StringComparison.InvariantCulture调用StringComparison.CurrentCulture(对于某些手动设置的线程区域性,以便不依赖于机器OS的配置)确实有意义。

c# .net string cultureinfo invariantculture
1个回答
0
投票
结合变音符号/非规范化字符串是一个示例。请参见以下答案以获得代码如下的体面处理: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: á á

相同的语言字符串(对于

all文化,应该表示相同的字符),但是不同的序数字符串(不同的字节)。

因此,不变式比较在这种情况下就像在比较它们之前对字符串进行规范化

查阅Unicode规范化/分解以获取更多信息。

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

因此,总而言之,一旦您在演奏“有趣的”字母(几乎是纯ascii之外的所有东西),一旦您对将字符串作为语言项目/字形流进行任何形式的比较感兴趣,您可能确实希望超越常规比较。

© www.soinside.com 2019 - 2024. All rights reserved.