当IndexOf用于查找后跟大值char的char(例如char 700为')时,IndexOf无法识别您正在查找的char.
例如
string find = "abc?abcabc";
int index = find.IndexOf("c");
Run Code Online (Sandbox Code Playgroud)
在此代码中,索引应为2,但它返回6.
有办法解决这个问题吗?
Mar*_*wul 14
Unicode字母700是修饰符撇号:换句话说,它修改字母c.同样地,如果你使用'e'后跟字符769(0x301),它就不再是'e'了:e已经被修改成具有强烈重音的e.即:é.您会看到该字母实际上是两个字符:将其复制到记事本并点击退格(整洁,嗯?).
您需要进行"序数"比较(逐字节)而不进行任何语言比较.这将找到'c',并忽略它被下一个字母修改的语言事实.在我的'e'例子中,字节是(65)(769),所以如果你逐字节地寻找65,你会发现它,而忽略了这样一个事实:(65)(769)在语言上是与(233)相同:é.如果您在语言上搜索(233),它将找到"等效"(65)(769):
string find = "abe?abcabc";
int index = find.IndexOf("é"); //gives you '2' even though the "find" has two characters and the the "indexof" is one
Run Code Online (Sandbox Code Playgroud)
希望这不会太混乱.如果你在实际代码中这样做,你应该在评论中准确地解释你正在做什么:在我的'e'示例中通常你会想要为用户数据做语义等价,并且对于例如常数有序等价(有希望不要这样不同,以免你的继任者用斧头追捕你.
该c?构造在语言上与简单字节不同.使用Ordinal字符串比较强制进行字节比较.
string find = "abc?abcabc";
int index = find.IndexOf("c", StringComparison.Ordinal);
Run Code Online (Sandbox Code Playgroud)