为何无匹配项时IndexOf(Vb6ChrW(65533))返回0而非-1?
异常返回值成因
返回值不符合预期是两个逻辑点共同作用的结果:
Vb6ChrW函数实现存在不规范问题
该实现依赖VB默认开启的隐式类型转换(Option Strict Off),将Char.ConvertFromUtf32返回的字符串直接赋值给Char类型变量。如果传入增补平面Unicode码点(值大于0xFFFF),ConvertFromUtf32会返回由两个Char组成的代理对字符串,隐式转换仅会取第一个代理项,最终生成非法Unicode序列,完全不符合VB6原生ChrW的行为。模拟VB6ChrW的正确写法为直接返回ChrW(uKeyCode And &HFFFF),无需调用ConvertFromUtf32。不过在传入参数65533(对应U+FFFD替换字符�)的场景下,该函数确实会返回包含单个�字符的字符串,不是返回0的直接诱因。- 核心诱因是
String.IndexOf默认比较规则的特殊行为
未指定StringComparison参数的IndexOf重载,默认使用当前区域性的语言敏感非序号比较,而非逐字符二进制精确匹配。U+FFFD是Unicode标准定义的替换字符,专门用于标记解码失败、无法识别的无效字符序列,.NET的文化敏感比较器对该字符存在特殊匹配逻辑:当查找目标仅包含U+FFFD时,比较器会误判任意字符串的起始位置(索引0)为匹配项,最终返回0而非预期的-1。
验证方案:将查找代码修改为
sSearchIn.IndexOf(sSearchFor, 0, StringComparison.Ordinal),强制使用二进制精确的序号比较,即可得到预期返回值-1。
内容的提问来源于stack exchange,提问作者tmighty
相关产品推荐
相关产品推荐

