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

Unicode字符串比较:变量赋值结果与数据提示、监视表达式不一致问题

问题分析与解决

这个现象的核心原因是VB.NET字符串比较运算符和调试器表达式求值使用了不同的比较规则,具体拆解如下:

首先要明确你代码里的两个字符串本质:str1包含的是全角小于号(Unicode码点 U+FF1C),而str2应该是你把HTML解码后的结果写成了转义序列<test——实际它的内容是半角小于号(U+003C),不然这两个完全不同的字符串不可能被判定为相等。

  • 代码里的<>运算符默认采用当前系统文化的语义比较:在中文等东亚文化环境中,全角符号和对应的半角符号会被视为语义等效的字符,所以str1<>str2会返回False(即两个字符串被判定为相等),最终different变量被设为False。
  • 但调试器的悬停提示、监视窗口默认用的是序数(Binary)比较:直接对比字符的Unicode码点,全角<和半角<的码点完全不同,所以会显示str1<>str2|True。

验证方法

你可以在代码里手动指定比较规则来验证这个差异:

' 用序数比较(和调试器逻辑一致),结果为True
Dim differentOrdinal = String.Compare(str1, str2, StringComparison.Ordinal) <> 0
' 用文化相关比较(和默认运算符逻辑一致),结果为False
Dim differentCulture = String.Compare(str1, str2, StringComparison.CurrentCulture) <> 0

运行后你会发现differentOrdinal是True,differentCulture是False,完全匹配你遇到的现象。

解决办法

如果你想让代码里的比较和调试器结果保持一致(严格按字符码点判断),可以二选一:

  • 在代码文件开头添加Option Compare Binary(VB.NET默认就是这个规则,但若之前被修改为Text则需要改回);
  • 直接使用指定序数规则的比较方式:
Dim different = String.Compare(str1, str2, StringComparison.Ordinal) <> 0

内容的提问来源于stack exchange,提问作者jmoreno

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:03:24