7

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

例如

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

在这段代码中,索引应该是 2,但它返回 6。

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

4

2 回答 2

14

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”示例中一般,您希望对用户数据进行语义等价,并对例如常量进行序数等价(希望不要像这样与众不同,以免你的继任者用斧头追捕你)。

于 2013-10-21T13:56:13.317 回答
7

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

        string find = "abcʼabcabc";

        int index = find.IndexOf("c", StringComparison.Ordinal);
于 2013-10-21T13:53:52.550 回答