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

pus*_*ser 7 c# indexof

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'示例中通常你会想要为用户数据做语义等价,并且对于例如常数有序等价(有希望不要这样不同,以免你的继任者用斧头追捕你.

  • 或者你可以告诉indexOf查找字符:`int index = find.IndexOf('c');` (7认同)
  • 啊,好点.在采访中这是一个邪恶的技巧问题:`IndexOf('c')`和`IndexOf("c")`之间有什么区别? (3认同)

Loo*_*fer 7

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

        string find = "abc?abcabc";

        int index = find.IndexOf("c", StringComparison.Ordinal);
Run Code Online (Sandbox Code Playgroud)

  • 或者只使用`find.IndexOf('c')`而不是提供字符串. (2认同)
  • @puser no,事实上它应该在技术上更快*. (2认同)