【问题标题】:IndexOf and ordinal string comparisonsIndexOf 和序号字符串比较
【发布时间】:2014-12-15 20:32:05
【问题描述】:

我的问题是String.IndexOf 返回-1。我希望它返回0

参数:

text = C:\\Users\\User\\Desktop\\Sync\\̼(注意Combining Seagull Below 字符)

stringToTrim = C:\\Users\\User\\Desktop\\Sync\\

当我检查索引时,使用int index = text.IndexOf(stringToTrim);index 的值是-1。我发现使用序数字符串比较解决了我的这个问题:

int index = text.IndexOf(stringToTrim, StringComparison.Ordinal);

在线阅读,很多 Unicode 字符(如 U+00B5U+03BC)映射到同一个符号,因此最好对此进行扩展并对两个字符串进行规范化:

int index = text.Normalize(NormalizationForm.FormKD).IndexOf(stringToTrim.Normalize(NormalizationForm.FormKD), StringComparison.Ordinal);

这是检查一个字符串在哪个索引处包含另一个字符串的所有连续字符的正确方法吗?所以这个想法是,当你想检查符号是否匹配时进行规范化,但是当你想通过字符的编码值检查字符时你不规范化(因此允许重复的符号)?另外,有人可以解释为什么int index = text.IndexOf(stringToTrim); 在字符串的开头没有找到匹配项吗?换句话说,它在幕后实际上在做什么?我本来希望它开始从字符串的开头到字符串的结尾搜索字符。

【问题讨论】:

  • 我将它复制/粘贴到 LinqPad 中并得到“0” - 也许我不明白组合字符。
  • @dnord 试试这个:"C:\\Users\\User\\Desktop\\Sync\\̼".IndexOf("C:\\Users\\User\\Desktop\\Sync\\"); 确保从这里完全/完全复制此文本!
  • (谢谢它的工作。)然后我肯定同意下面的最高评价者的回答:组合字符会改变前一个字符(通过组合),或者你发现了一个至少微软警告过你的奇怪错误关于。
  • @dnord 您可能还会发现这个字符很有趣:unicode-table.com/en/search/?q=U%2B202E(从右到左覆盖,不要弄错,如果您突出显示显示为空白的内容并将此字符粘贴到某处,然后开始输入, 字符输入到左边而不是右边,所以当你输入时,“like this”会变成“siht ekil”。
  • @dnord 还有多种利用这个角色的方法,但我的问题有点离题,我仍然喜欢向人们展示一些东西:krebsonsecurity.com/2011/09/…

标签: c# string unicode indexof culture


【解决方案1】:

这种行为对我来说很有意义。您正在使用一个组合字符,它与前面的字符 组合,将其转换为不同的字符,该字符与您在搜索结束时指定的 '\\' 字符不匹配细绳。这样可以防止找到您要查找的整个字符串。如果您改为寻找"C:\\Users\\User\\Desktop\\Sync",它就会找到它。

使用StringComparison.Ordinal 告诉.NET 忽略字符的各种规则,只查看它们的确切序数值。这似乎可以满足您的需求,所以是的……您应该这样做。

“正确的方法”完全取决于您想要什么行为。许多字符串操作涉及向用户呈现或由用户提供的文本,并且应该以文化感知和 Unicode 感知的方式完成。其他时候,这是不可取的。根据您的需要选择正确的方法很重要。

【讨论】:

    【解决方案2】:

    是的,您应该使用StringComparison.Ordinal 来保证在比较值时忽略文化。对于“默认情况下”被认为是文化不变的所有字符串,这尤其必要。这包括文件路径。

    不使用StringComparison.Ordinal) 时可能会引入细微的错误:http://msdn.microsoft.com/en-us/library/dd465121(v=vs.110).aspx

    当文化上独立的字符串数据,例如 XML 标签、HTML 标签、 用户名、文件路径和系统对象的名称是 解释为好像它们是文化敏感的,应用程序代码可以 受到细微错误、性能不佳以及在某些情况下的安全性的影响 问题。

    StringComparison.Ordinal 的一些附带好处是更好的性能:http://msdn.microsoft.com/en-us/library/ms973919.aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-08
      • 1970-01-01
      • 2022-12-05
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      相关资源
      最近更新 更多