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

本文关键字:识别 修改 字符 IndexOf 字符串 | 更新日期: 2023-09-27 18:36:11

当使用IndexOf查找后跟一个大值字符(例如,字符700是ʼ)时,IndexOf无法识别您要查找的字符。

例如

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

在此代码中,索引应为 2,但返回 6。

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

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

Unicode 字母 700 是一个修饰符撇号:换句话说,它修改了字母 c。 同样,如果你使用一个"e"后跟字符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"例子中一样,通常你会希望对用户数据进行语义等价,对例如常量进行序数等价(希望不会像这样不同,以免你的继任者用斧头追捕你)。

构造在语言上与简单字节不同。使用序号字符串比较强制进行字节比较。

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