string.IndexOf()无法识别修改后的字符

时间:2013-10-21 13:49:52

标签: c# indexof

当使用IndexOf查找后跟大值char的char(例如char 700为')时,IndexOf无法识别您要查找的char。

e.g。

string find = "abcʼabcabc";   
int index = find.IndexOf("c");

在此代码中,index应为2,但返回6.

有没有办法解决这个问题?

2 个答案:

答案 0 :(得分:14)

Unicode字母700是modifier apostrophe:换句话说,它修改了字母c。同样地,如果你使用'{'后跟character 769 (0x301),它就不再是'e'了:e已被修改成具有强烈重音的e。即:é。您会看到该字母实际上是两个字符:将其复制到记事本并点击退格(整洁,嗯?)。

您需要进行“序数”比较(逐字节)而不进行任何语言比较。这将找到'c',并忽略它被下一个字母修改的语言事实。在我的'e'例子中,字节是(65)(769),所以如果你逐字节地寻找65,你会发现它,而忽略了这样一个事实:(65)(769)在语言上是与(233)相同:é。如果您在语言上搜索(233),它将找到“等效”(65)(769):

string find = "abéabcabc";
int index = find.IndexOf("é"); //gives you '2' even though the "find" has two characters and the the "indexof" is one

希望这不会太混乱。如果你在实际代码中这样做,你应该在评论中准确地解释你正在做什么:在我的'e'例子中,你通常想要对用户数据进行语义等价,并且例如对于例如用户数据进行有序等价。常数(希望不会像这样不同,以免你的successor hunt you down with an axe)。

答案 1 :(得分:7)

构造的处理方式与简单字节在语言上不同。使用序数字符串比较强制进行字节比较。

        string find = "abcʼabcabc";

        int index = find.IndexOf("c", StringComparison.Ordinal);