【问题标题】:odd results when comparing strings based on culture基于文化比较字符串时的奇怪结果
【发布时间】:2016-03-14 18:40:18
【问题描述】:

有什么原因吗:

字符串 s1 = "aéa"; 字符串 s2 = "aea";

string result = s1.Equals(s2, StringComparison.CurrentCultureIgnoreCase);
result = s1.Equals(s2, StringComparison.InvariantCultureIgnoreCase);

result = false 在所有情况下,尽管我目前的文化是法国文化。 我希望这两行之一应该返回 true?

另一方面,我得到了

int a = string.Compare(s1, s2, CultureInfo.CurrentCulture, CompareOptions.IgnoreNonSpace);

a = 0 表示相等。

这对我来说听起来很矛盾。有什么解释???

提前谢谢。

【问题讨论】:

  • 你可以参考这个网址寻求帮助。stackoverflow.com/questions/2876237/…
  • 您的前两个比较忽略了大小写,而您的第三个比较忽略了nonspacing combining characters(包括尖锐的口音),因此它们会产生不同的结果似乎是合乎逻辑的。如果您使用CompareOptions.IgnoreCase,我猜结果将与您的第一次比较匹配。
  • @Mark "aéa" 和 "aea" 的大小写相同。那么从我的角度来看,与 CurrentCultureIgnoreCase 的比较应该返回 true 吗?我正在寻找返回这些字符串相等的不同方法。

标签: c# string cultureinfo


【解决方案1】:

在第一次相等检查中,您将忽略当前文化 (fr) 中 StringComparison.CurrentCultureIgnoreCase 的大小写。所以,首先检查应该是false

在第二个中,您使用StringComparison.InvariantCultureIgnoreCase 忽略不变文化中的大小写。在不变文化中,é 不等于 e。在大多数文化中,这些字符实际上是不同的(具有不同的含义)。这个检查应该是false

在最后一个中,您忽略了带有CompareOptions.IgnoreNonSpace 的字符,例如变音符号。最后一个应该是true

另外,请阅读here

【讨论】:

  • 好的,我明白了,我想我可以根据 StringComparison 枚举得到 é 和 e 的相等结果,但看起来不是。然后我会用 CompareOptions.IgnoreNonSpace 找出一个解决方案。感谢您的宝贵时间。
猜你喜欢
  • 2019-10-26
  • 1970-01-01
  • 2012-03-09
  • 2011-09-18
  • 2013-08-16
  • 2011-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多