2

我正在尝试将 ASCII 字符 131(ƒ - 带钩子的拉丁小写字母 f)输出到消息框,但由于某些奇怪的原因,它显示为空字符串。我有以下 VB.NET 代码:

Dim str As String = Convert.ToChar(131)
MessageBox.Show(str, "test", MessageBoxButtons.OK, MessageBoxIcon.Information)
Debug.Print(str)

在上面,消息框没有显示任何内容,但 debug.print 语句在“立即窗口”中正确显示了字符。我有大约 70 个其他 ascii 字符都可以使用这种方法正常工作,但只有少数几个显示为空白(131 和 EN 破折号 150)。

例如,以下工作:

str = Convert.ToChar(164)
MessageBox.Show(str, "test", MessageBoxButtons.OK, MessageBoxIcon.Information)
Debug.Print(str)

我也尝试转换为 UTF8,但我得到了与第一个代码片段相同的行为:

Dim utf8Encoding As New System.Text.UTF8Encoding(True)
Dim encodedString() As Byte
str = Convert.ToChar(131)
encodedString = utf8Encoding.GetBytes(str)
Dim str2 As String = utf8Encoding.GetString(encodedString)
MessageBox.Show(str2, "test", MessageBoxButtons.OK, MessageBoxIcon.Information)
Debug.Print(str2)

这是编码问题吗?感谢您的任何见解。

编辑:澄清一下,我实际上并没有尝试将字符输出到消息框。该代码只是一个测试。我试图将字符作为字符串传递给在第 3 方 xml 编辑器控件中使用它的函数,但它显示为空白。即使在 Visual Studio 中调试时,您也可以看到它的值等于“”。

编辑 2:感谢下面接受的答案的一些调查,我发现我使用了错误的 unicode 字符。对于这个 f 字符,要使用的代码是 ToChar(402)。这非常有效。谢谢你们。

4

1 回答 1

4

正如其他人所指出的,“ƒ”字符不是 ASCII 字符。ASCII 严格来说是 7 字节格式,“扩展 ASCII”字符完全不同,具体取决于您引用的编码。例如,Windows CodePage 1250的字符 131(0x83) 有一个空白,但CodePage 1252在该插槽中具有“ƒ”字符。

我在下面的示例中使用 1252,但如果您要转换较大的编码 ASCII 文本主体,您应该确保正确识别正在使用的编码并使用正确的代码页进行转换。

我认为,处理这个问题的最好方法是将所有内容都转换为 Unicode,并远离扩展的 ASCII,除非出于遗留原因绝对必要。但是,要获得“ƒ”字符,您可以执行以下操作:

Imports System.Text

进而 :

Dim enc1252 As Encoding = Encoding.GetEncoding(1252)
Dim bArr(0) As Byte
bArr(0) = CByte(131)

Dim str2 As String = Encoding.Unicode.GetString( _
                     Encoding.Convert(enc1252, Encoding.Unicode, bArr))

MessageBox.Show(str2, " test", MessageBoxButtons.OK, _
                MessageBoxIcon.Information)

然而,VisualStudio 本身使用 Unicode,所以如果您只需要显示“ƒ”字符,并且不需要实际转换任何旧文本,您总是可以这样做:

MessageBox.Show("ƒ", " test", MessageBoxButtons.OK, _
                MessageBoxIcon.Information)
于 2013-03-05T18:14:44.830 回答