You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何无匹配项时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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 16:09:19