【发布时间】: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+00B5 和 U+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