.NET中IndexOf方法出现异常查找结果,该行为是否为设计预期?
结论
该行为属于.NET的预期设计,核心原因是IndexOf默认采用区域性敏感的文本匹配规则,而非按Unicode码点逐位对比的序数匹配。
原因拆解
- 你观测到的第4个字符值为1560,对应Unicode码位
U+0618(阿拉伯小文高音塔纳维尔符号),属于Unicode中的非间距组合标记,默认文本匹配规则会将它和前方紧邻的基字符(即位置2的冒号)绑定为一个独立的文本元素。 - 默认的
IndexOf重载在匹配时会将这个绑定后的组合单元视为整体,不会单独匹配其中的基字符,因此搜索单独的冒号时无法命中位置2的字符,返回-1。
解决方法
如果需要按字符码点做精确匹配,使用带StringComparison.Ordinal参数的重载即可得到预期结果:
// 输出结果为 2 Console.WriteLine(":::ؘ".IndexOf(":", 2, StringComparison.Ordinal));
另外纠正你之前的误解:字符串长度异常和你提到的「双引号字符差异」无关,是你定义字符串时意外引入了隐藏的U+0618控制字符,通常是从其他排版文档复制粘贴内容时带入的。
内容的提问来源于stack exchange,提问作者Thomas C. G. de Vilhena
相关产品推荐
相关产品推荐

