2013-03-05 155 views
2

我想输出ASCII字符131(ƒ - 带钩子的拉丁小写字母f)到一个消息框,但由于某种奇怪的原因,它显示为空字符串。我有以下VB.NET代码:为什么这个ASCII字符输出为空字符串(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) 

我也试图转换为UTF-8,但我得到了相同的行为在第一个代码段:

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) 

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

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

编辑2:感谢来自下面接受的答案的一些调查,我发现我使用了错误的Unicode字符。对于这个f字符,使用的代码是ToChar(402)。这工作完美。谢谢你们。

+2

字符”ƒ“不是Ascii字符。这可能或可能不相关。此字符在不同的字符代码中具有不同的代码号。 – 2013-03-05 17:13:00

+0

在vb.net(MS Sans Serif)中查看默认字体时,我看不到那个符号,粘贴到记事本中,然后更改为Sans Serif这个符号显示为一个奇怪的字符,它可能是字体问题吗? – bendataclear 2013-03-05 17:22:06

+0

MessageBox使用默认的系统字体。如果该字符不在默认系统字体中,那么您将看不到该字符。你可以推出你自己的MessageBox,或者看看[Extended Message Box Library](http://www.news2news.com/vfp/?solution=5),它看起来像它允许你改变字体(以及其他的东西)在标准的MessageBox上。 – codechurn 2013-03-05 17:36:42

回答

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) 
+0

感谢您提供丰富的解决方案! (使用在我的上下文中工作的1252编码,只是将硬编码字符传递给该函数并没有_not_ work) – http203 2013-03-05 18:24:42

+0

@ http203您正在使用哪种版本的VisualStudio? – 2013-03-05 18:39:46

+0

@J 2008目前。顺便说一句,我发现ToChar(402)正确输出字符... visual studio使用什么代码页,我应该引用什么官方文档? – http203 2013-03-05 18:46:08

相关问题