C#String.IndexOf-带有特殊字符的文本返回错误结果

C#String.IndexOf-带有特殊字符的文本返回错误结果,c#,special-characters,indexof,C#,Special Characters,Indexof,“*{IPA|ntɹvaɪtl}}} “*{IPA|ntɹvaɪtl}”.IndexOf(“}”)返回18 我希望第一批样品能返回18 请注意,在第一个示例中,结尾的双括号后面有一个特殊字符U+0329 U+0329下方的合并垂直线 为什么它返回-1而不是18?即使在顺序搜索中,字符串也包含“}}”,因此它不应该返回-1。(注意:我不是Unicode专家。) 问题可能是字符U+0329是组合字符。如果将字符串中的}替换为字母字符,您将更清楚地看到问题: "the̩" 请注意,在本例中,U+03

“*{IPA|ntɹvaɪtl}}}

“*{IPA|ntɹvaɪtl}”.IndexOf(“}”)
返回18

我希望第一批样品能返回18

请注意,在第一个示例中,结尾的双括号后面有一个特殊字符U+0329

U+0329下方的合并垂直线

为什么它返回-1而不是18?即使在顺序搜索中,字符串也包含“}}”,因此它不应该返回-1。

(注意:我不是Unicode专家。)

问题可能是字符U+0329是组合字符。如果将字符串中的
}
替换为字母字符,您将更清楚地看到问题:

"the̩"
请注意,在本例中,U+0329作为一个修饰符出现在字符串的
e
上,改变了字符的视觉表示。同样的情况也发生在
}
字符对上,尽管很奇怪

您拥有的不是一对右花括号字符,而是一个右花括号和一个右花括号+组合字形下方的垂直线。使用默认的
StringComparison
选项进行比较时,搜索字符串中的第二个右大括号不匹配,因为它与不同的字形(字符序列)匹配

但是,使用
StringComparison.Ordinal
会改变Unicode的处理方式,忽略U+0329的组合属性,而只是比较代码点


有趣的是在搜索重音字符时,因为在使用
CurrentCulture
InvariantCulture
时,通常有多个字形看起来相同,比较起来也相同,但组成方式不同

例如,带有锐音“
é
”的拉丁小写字母E与字形拉丁小写字母E+组合锐音重音(U+0065,U+0301)”相比,代码点U+00E9为“
E”
”。使用
InvariantCulture
时,它们看起来相同,比较起来也相同,但使用
Ordinal
比较时则不同


您可以做很多工作,只是试图定义处理此问题的“正确”方式,更不用说以这种方式实施了。我经常发现,最好是简单地接受某些字符序列会给您带来麻烦,然后选择一个
StringComparison
值作为参考。

我想知道它是否与文化相关。如果您尝试
“foo.IndexOf”(“,StringComparison.InvariantCulture)”,会怎么样我尝试过,它不起作用。-1表示它没有找到匹配项,如果搜索字符串中有一个额外的隐藏字符不在您正在搜索的字符串中,那么将找不到匹配项。对于感兴趣的人,此答案中有一些好信息:可能重复谢谢。这就是我一直在寻找的答案。