我的问题是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+00B5和U+03BC)映射到相同的符号,因此最好对此进行扩展并对两个字符串进行规范化:
int index = text.Normalize(NormalizationForm.FormKD).IndexOf(stringToTrim.Normalize(NormalizationForm.FormKD), StringComparison.Ordinal);
这是检查一个字符串包含另一个字符串的所有连续字符的索引的正确方法吗?所以我们的想法是,当你想要检查符号是否匹配时,你会规范化,但是当你想通过它们的编码值检查字符时你不规范化(因此允许重复的符号)?另外,有人可以解释为什么int index = text.IndexOf(stringToTrim);
在字符串的开头找不到匹配项?换句话说,它实际上是在做什么呢?我原以为它会从字符串的开头到字符串的结尾开始搜索字符。
答案 0 :(得分:6)
这种行为对我来说非常有意义。您正在使用组合字符组合与前一个字符,将其转换为另一个字符,该字符与您在结尾处指定的'\\'
字符不匹配。你的搜索字符串。这可以防止找到您正在寻找的整个字符串。如果你找了"C:\\Users\\User\\Desktop\\Sync"
,它就会找到它。
使用StringComparison.Ordinal
告诉.NET忽略字符的各种规则,只查看它们的确切序数值。这似乎做你想要的,所以是的......那就是你应该做的。
“正确的方法”完全取决于您想要的行为。许多字符串操作涉及向用户呈现或提供的文本,并且应该以文化感知和Unicode感知的方式完成。其他时候,这是不可取的。选择适合您需求的方法非常重要。
答案 1 :(得分:1)
是的,您应该使用StringComparison.Ordinal
来保证在比较值时忽略文化。特别是对于所有被认为是文化不变的字符串是必要的"默认情况下#34;。这包括文件路径。
不使用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