如何让Visual Basic区分标准双引号与弯引号的差异?
解决VBScript无法区分直引号与弯引号的问题
这个问题的核心在于VBScript默认的字符串比较逻辑——它是**区域感知(locale-aware)**的,会把一些视觉相似但Unicode编码不同的字符(比如直双引号" U+0022和右弯双引号” U+201D)视为等价,所以才会出现你测试的那种相等判断结果。
要让VBScript严格区分这两种引号,你可以用以下两种方法:
1. 使用二进制比较替代默认文本比较
VBScript提供了StrComp函数,通过指定第三个参数为vbBinaryCompare(数值为0),可以强制按字符的Unicode编码值做逐字节的严格比较,这样就能区分直引号和弯引号了。
示例代码:
' 默认比较(返回True,因为locale视为等价) MessageBox.Show("""1""" = "””1””") ' 二进制比较(返回False,因为编码不同) MessageBox.Show(StrComp("""1""", "””1””", vbBinaryCompare) = 0)
StrComp返回0表示两个字符串相等,返回1或-1表示不等,用这个逻辑来判断就能得到准确的区分结果。
2. 对字符串操作函数指定二进制模式
如果你需要做查找、替换这类字符串操作,也要给对应的函数加上vbBinaryCompare参数,确保操作是基于严格编码的:
' 查找字符串中的直引号位置(二进制模式) dim straightQuotePos straightQuotePos = InStr(1, yourString, """", vbBinaryCompare) ' 查找字符串中的弯引号位置 dim curlyQuotePos curlyQuotePos = InStr(1, yourString, "”", vbBinaryCompare)
额外注意事项
因为你是用Python生成VBScript代码直接运行,只要Python生成的字符串正确包含弯引号的Unicode字符(而不是被转义或错误转换),VBScript就能正确接收这些字符——VBScript本身是支持Unicode的,不需要额外处理编码,重点就在比较/操作时的模式选择。
内容的提问来源于stack exchange,提问作者Zen Skunkworx




