【问题标题】:Strange behavior of String.Compare with OrdinalIgnoreCaseString.Compare 与 OrdinalIgnoreCase 的奇怪行为
【发布时间】:2017-09-07 12:15:16
【问题描述】:

MSDN 在 StringComparison.OrdinalIgnoreCase 上说:

OrdinalIgnoreCase 属性返回的StringComparer 将要比较的字符串中的字符视为使用不变区域性的约定转换为大写,然后执行与语言无关的简单字节比较。 这在比较以编程方式生成的字符串或比较不区分大小写的资源(如路径和文件名)时最合适。

https://msdn.microsoft.com/en-us/library/e6883c06(v=vs.110).aspxhttps://msdn.microsoft.com/en-us/library/system.stringcomparer.ordinalignorecase%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396

但是,当我尝试比较时

String.Compare("‎a","A", StringComparison.OrdinalIgnoreCase)

返回值是1 而不是0

更奇怪的是:

String.Compare("‎1","1", StringComparison.OrdinalIgnoreCase)

虽然字符串相等,但它也返回 1

我错过了什么?

【问题讨论】:

  • 您要检查相等性还是排序字符串?
  • 在我遇到这个的特定场景中检查相等性

标签: .net


【解决方案1】:

经过一个小时的挖掘找到了原因:原来其中一个字符串包含一个不可见字符 %e2%80%8e (LEFT-TO-RIGHT MARK),该字符仅在获取字符串并将其转换为数组时可见.

【讨论】:

【解决方案2】:

我不确定你为什么会得到这个结果。当我通过 LinqPad 运行此代码时,我得到 0。

如果大小写不相关,您可以尝试其他重载String.Compare(string, string, bool)

String.Compare("‎a","A", true);
String.Compare("‎1","1", true);

【讨论】:

  • 在 LinqPad 上,当我写比较时它也返回 0,然后我从这个问题复制我的比较并返回 1。这就是我搜索隐藏字符的原因
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-19
  • 2021-10-30
  • 2022-01-20
  • 2018-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多