如何在VB6中显示Unicode字符?

5

问号是编码问题,当Unicode字符串转换为Ansi时会出现。请发布一段代码片段。 - Hans Passant
@CJ7 有许多黑色竖矩形。因此,最重要的是你想用什么语言来进行这个Unicode戏法?根据所选择的语言,您可以设置Font.CharsetFont.Name属性。 - bonCodigo
3个回答

7
这里有一个教程可以探索。查看这篇文章了解黑色竖矩形
假设Unicode已经打开,发送以下字符串到窗口以显示: Wchar_t mStr[] = {9646,0,0}; 参考。这个代码片段和参考更符合C++。在Visual C++中,您可以使用以下步骤关闭/打开UNICODE:
1. 在VS2008/2010中打开项目; 2. 在“解决方案资源管理器”中右键单击项目,然后单击“属性”; 3. 选择配置属性 -> 常规,选择字符集并将当前值更改为使用多字节字符集。(关闭)

关于在VB中显示UNICODE的好文章 displaying UNICODE in VB

当您在Form中使用textbox控件时,需要将Microsoft Forms 2.0 Object Library添加为参考库。此组件提供支持Unicode的控件,例如:文本框、标签、命令按钮、列表框、组合框、复选框、单选按钮、切换按钮、图像、选项卡和多页面控件。

在VB6中处理并显示非美国ANSI字符时,您需要了解3个主要内容:

  • 在内部,VB6将字符串存储为Unicode。
  • 显示字符串时,标准VB6文本框和标签控件进行从Unicode到ANSI的隐式(和内部)转换。
  • 标准VB6文本框和标签控件根据您可以指定的字符编码显示ANSI字节。
Unicode-to-ANSI 转换后,VB6 尝试根据控件的 Font.Charset 属性显示字符数据,如果未更改,则等同于 ANSI 字符集。更改控件的 Font.Charset 会改变 VB6 解释 "ANSI" 字节的方式。换句话说,您告诉 VB6 将字节视为某种其他字符编码,而不是 "ANSI"。
例如,考虑在英文计算机上尝试显示 Unicode 日语 字符串:您设置 Font.Charset = 128(用于日语),但您的 Unicode 字符串显示为所有问号字符。这是因为 VB6 首先尝试将您的日语 Unicode 字符串转换为 ANSI,在英文计算机上为 Windows-1252。Windows-1252 无法表示日语字符。每个字符都无法转换并被替换为问号。例如,在 TextBox 控件的属性设置中选择日语脚本与在运行时设置 Font.Charset 相同。 作为Jukka所说,字体在显示UNICODE时发挥着至关重要的作用,因为字体中包含了字符的可用性。正如Hans所说,不支持字形的字体会产生一个矩形。因此,您需要确保您选择的字体能够呈现字形。例如,MS Sans Serif字体无法呈现ƒ(带钩的小写拉丁字母F,2字节Unicode值为0x0192),因此您将看到一个细长的实心矩形框代替它。但是在Windows上,很少有字体具有足够广泛的字符库来表示中文。
在下面的代码中,字体名称()在运行时设置,同时设置了字体字符集。
字符集属性:
134     Simplified Chinese, gb2312 - Mainland China(PRC) and Singapore
136     Traditional Chinese, big5 - Taiwan and Hong Kong

代码:

Sub changeToUniCodes()
Dim strTxt2 As String    

UserForm1.TextBox2.Font.Charset = 134    '--CHINESESIMPLIFIED_CHARSET
UserForm1.TextBox2.Font.Name = ChrW(&H5B8B) + ChrW(&H4F53) '-- 宋体 SimSun font

UserForm1.TextBox2.Text = ChrW(37446)
strTxt2 = UserForm1.TextBox2.Text
'notice that ChrW(9246) produces a different character in Chinese
UserForm1.TextBox2.Text = strTxt2 & " " & ChrW(9246)
End Sub

在VBE IDE中输出:您也可以在VB6窗体中尝试。

enter image description here

在完成以上所有的写作后,我注意到了这篇MSDN文章。好吧,至少它确认了VB :D

你说的“假设Unicode已打开”是什么意思?它如何打开? - CJ7
1
@CJ7请查看更新后的答案,其中包含代码片段和注释。 :) 对于回复晚了我很抱歉。 - bonCodigo

1
你需要使用“Unicode aware”控件。VB6只提供了其中的一些,但在Vista及以后版本或XP(仅限平板电脑版,除非您使用此库的非Ink redist版本),InkEdit控件可以实现这一点。
InkEdit1.Text = ChrW$(9646)

请注意 $,它表示一个返回字符串的函数,而不是一个嵌入其中的变量。
InkEdit 控件实际上是一个增强的 RichTextBox,支持在启用墨迹的系统上输入墨迹和键入。它还是一个 Unicode 控件,并支持 Unicode 属性,例如 .Text
标准 MSHFlexGrid、DataGrid 和一些其他控件也支持 Unicode。
有关问题字符的字符,请参见http://www.alanwood.net/unicode/geometric_shapes.html。您基本上可以忽略 ANSI、Charset 等方面的内容。它相关但不适用于此处。 ▮ 9646 ▮ 25AE BLACK VERTICAL RECTANGLE

0
显示问号的原因是因为所使用的字体中没有该字符。您需要将字体设置为支持黑色垂直矩形的字体,如Arial Unicode MS或Lucida Sans Unicode。

2
缺失的字形会产生一个矩形,而不是一个问号。 - Hans Passant

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