当使用IndexOf
查找后跟大值char的char(例如char 700为')时,IndexOf
无法识别您要查找的char。
e.g。
string find = "abcʼabcabc";
int index = find.IndexOf("c");
在此代码中,index应为2,但返回6.
有没有办法解决这个问题?
答案 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)
cʼ
构造的处理方式与简单字节在语言上不同。使用序数字符串比较强制进行字节比较。
string find = "abcʼabcabc";
int index = find.IndexOf("c", StringComparison.Ordinal);