在VB中使用左双引号标记的字符串

16

在下面这段代码中,字符串 "“" 的使用(即字符串中的左双引号)导致 VB.NET 编译错误:

StringVar = Replace(StringVar, "“", "“")

这里在发生什么事情?


2
很遗憾听到这个消息,谢谢您的分享。:( - user541686
2
顺便说一下,这是一个非常棘手的问题。因为你提出了这个问题,所以加1分。 - Konrad Rudolph
3个回答

16

似乎您想将卷曲引号替换为它们的HTML代码等效物。

初看您的代码是绝对正确的。 问题在于VB允许在代码中使用卷曲引号代替常规引号(因为Unicode很棒,不是吗?)。也就是说,以下代码都是等效的:

Dim str = "hello"
Dim str = “hello”
Dim str = "hello“

如果你想在字符串中使用引号,VB 无法确定引号是否应该结束字符串。在 C# 中,这可以通过对引号进行转义来解决,即用 "\"" 来代替 """。在 VB 中,同样可以通过将引号 重复 使用来实现,即 """"

回到你的卷曲引号。根据 VB 语言规范(¶1.6.4),与直引号相同的规则也适用于卷曲引号。因此,要在代码中编写卷曲引号,请尝试以下方法:

StringVar = Replace(StringVar, "““", "“")

很不幸,我现在无法尝试这段代码,而且有可能IDE会直接用直引号替换它。如果是这种情况,可以使用ChrChrW和“左双引号”的字符代码进行替换:

StringVar = Replace(StringVar, ChrW(&H201C), "“")

或者,为了对称,用十进制表示(但我更喜欢用十六进制表示字符代码):

StringVar = Replace(StringVar, ChrW(8220), "“")

还有一点需要注意: Replace 函数可能很快被废弃,并且并不支持所有情况(例如Windows Phone 7)。而是使用 String 类的 Replace 方法:

StringVar = StringVar.Replace(, ChrW(8220), "“")

4
哦,我的天啊!去你的,Visual Basic! - Mehrdad Afshari
1
没错,你说得对。我之前不知道这个。但是一旦听到了,确实非常有道理。非常好的答案。+1 - Cody Gray
1
““”不起作用;IDE会替换花括号引号。然而,ChrW挽救了我的一天。谢谢! - raven
我敢打赌,VB在字符串文字中会尊重双花括号引号,因为微软公司期望某些Word用户在Word本身中编写宏代码,然后意识到他们的错误并将其粘贴到宏编辑器中,此时花括号引号将破坏代码。(纯属推测) - easeout
2
@Kevin 不错的猜测,但可能是错误的:VB 只在 .NET(VB7)中开始接受花括号引号。同时,VBA 已经存在,但继续多年使用 VB6 方言语言,不支持花括号引号。因此,该功能被引入到一个在 Word 宏中未被使用的语言中。 - Konrad Rudolph
显示剩余2条评论

0

0

看起来你正在搜索 Microsoft.VisualBasic 命名空间中的 ChrW 函数,该函数用于将 Unicode 字符代码转换为实际字符。

如果你想用卷曲引号替换字符串中的直引号,请尝试以下代码:

'Declare a string that uses straight quotes
Dim origString As String = "This string uses ""quotes"" around a word."

'Create a new string by replacing the straight quotes from the original string
'with left-facing curly quotes
Dim newString As String = origString.Replace("""", ChrW(8220))

'Display the result
MessageBox.Show(newString)

或者,如果您正在尝试通过替换左向卷曲引号并使用替代符号来对字符串进行编码(假设您在问题中使用的是正确的符号),请尝试以下代码:

'Declare a string that uses left-facing curly quotes
Dim origString As String = "This string uses fancy " & ChrW(8220) & _
                           "quotes" & ChrW(8220) & " around a word."

'Create a new string by replacing the curly quotes with an arbitrary string
Dim newString As String = origString.Replace(ChrW(8220), "“")

'Display the result
MessageBox.Show(newString)

Cody,你是否可能混淆了一些事情?OP的代码看起来像是他想用HTML转义码替换花括号引号。而且那段代码绝对正确。既不是“&#”错误,也不是分号。 (我看到OP已经接受了你的答案,所以也许我错了,但我不这么认为)。 - Konrad Rudolph
@Konrad: 是的,完全有可能。当我尝试回答这个问题时,我是凭直觉猜测的。对于他/她想要实现什么目标,我一点都不清楚。 - Cody Gray
代码和问题实际上非常清晰,一旦你知道 VB 处理花括号引号和转义的一个重要事实,就会明白。;-) 问题是,甚至经验丰富的 VB 程序员也不知道这个……请看我的答案。 - Konrad Rudolph
我只是想比较两个字符串。问题在于VB认为一个带有普通双引号的字符串等同于同样的带有卷曲引号的字符串。 - Zen Skunkworx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接