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
相关产品推荐
相关产品推荐

