下一页 1 2
在DOS时代,拥有一个华丽的汉字菜单几乎是每个高档中文应用程序必须的包装。中文Windows操作系统的出现使得高级开发平台实现全中文的提示和界面非常容易和方便。在一般的应用程序中已经很少需要去专门考虑汉字处理的问题。
但是在许多工程控制和字符串处理的环境中,汉字字符的处理仍然有别于西文字符的处理,需要加以专门的考虑。
一、VB6对汉字处理的支持
对汉字处理,VB6主要是提供了一些输入法设置方面的支持。它提供了一个ImeMode属性和ImeStatus函数来确定和设置输入法的状态。而且此属性和方法只在VB6的东亚区版本中有效。
IMEStatus函数返回一个整数,用来指定当前Windows的输入法(IME)方式。
下面是中文地区的返回值:
常数 值 描述
vbIMENoOP 0 不安装IME(缺省)
vbIMEOn 1 打开IME
ImeMode属性返回或者设置被选定的对象的 IME (Input Method Editor,输入方法编辑器)状态。
可以先用ImeStatus函数来检测当前的输入状态,并用IMEMode来控制其输入状态。
如Text1.IMEMode=0(预定值)、=1(切换为中文输入)、=2(切换为英文输入)
对于简体汉字和繁体汉字 IME,只能使用设置 0 到 2。设置 3 到 10 对于汉字系统是无效的。
VB6功能上对汉字处理的直接支持也仅限于此。对于汉字字符串的处理,VB6并没有提供专门的函数和方法。
二、确定汉字字符串的长度
各个版本的VB对汉字字符的长度定义并不相同。在Windows 3.x中,VB3中认为每个汉字的长度为2字节。VB自从32位版本以後,不管中英文字,均以2 bytes来储存,这与中文Win95的汉字内核有关。但是VB4以后,VB认为每个汉字的长度为1。这在处理包含汉字的字符串时带来很多的不便。
由于Len、Left、Mid等字符串函数认为一个汉字和一个西文字符的长度都为1,因此处理汉字字符串时有一定的难度。实现上必须要能把汉字按照两个字符(字节)的形式读出。因此在截取汉字字符串的子串时需特别注意。
由于汉字处理和汉字字模存储的特殊性,在许多情况下我们希望汉字字符的长度为2,英文字符为1。由于VB5和VB6把一个汉字作为一个字符。因此处理汉字时首先必须能正确判断汉字字符串的长度。
在VB3或C++里,汉字的 ASCII码均大于零,而VB5和VB6中汉字的ASCII码小于0。因此通过判断一个未知字符的ASCII码就可以判断该字符是否汉字。
这里我们提供了两种方法来判断汉字字符串的长度。
1、方法1
VB6中提供了LenB函数用于字符串中的字节数据。如同在双字节字符集(DBCS)语言中一样,LenB返回的是用于代表字符串的字节数,而不是返回字符串中字符的数量。如为用户自定义类型,LenB返回在内存中的大小。
LenB(StrConv(Str1,vbFormUnicode))
对要处理的字符串Str1,必须先使用StrConv函数把ANSI格式的Byte数组转换为字符串,否则直接使用LenB函数得到的结果比实际结果大。
2、方法2
这里自定义了一个子函数CLen来计算汉字字符串的实际长度。同时还能判断字符串中汉字的实际个数。
Function CLen(HzStr$) as Integer
Static HzNum as Integer
L = len(HzStr$)
For n=1 to L
If Asc(mid$( HzStr$,n,1))<0 Then HzNum = HzNum + 1
Next n
Clen = L + HzNum
End Function
CLen函数中的静态变量HzNum返回字符串中实际汉字的数目。
三、汉字字模读写和存储的机理
计算机是以编码的方式来处理和使用字符的。西文字符采用一个字节表示,即ASCII码,一般只用七位来表示128个字符,而把最高位用作奇偶校验(或者不用)。我国国标规定汉字用内码表示,内码为两个字节。为了保证中西文兼容,也就是说汉字系统的内码必须同时允许ASCII码和汉字的使用,两者之间不应发生冲突。目前规定每个字节只用七位,若两个字节的最高位均为1,则该字符为汉字。
国标对汉字字库的结构作了统一规定,即将字库分成若干个区,每个区有94个汉字,每个汉字在字库中有确定的区和位,因此每个汉字各有一个区位码,知道了区位码也就相当于知道了汉字在字库中的位置。由于汉字的内码与区位码有一定的关系,所以只要通过汉字的内码就可得到该汉字的区位码,也就得到了该汉字的字模。
查找一个汉字字模数据的算法为:
汉字内码 -> 区位码 -> 记录号 -> 字模数据
一个16点阵汉字其字模数据共有32字节,可以看作是一条记录,在程序中可以用一个数组存放。在DOS的图形模式下,汉字是通过描点的方法逐点画上去的。读取字模中每个字节的每一位,就能确定汉字中的每个点。故一个16×16点阵的汉字必须要32个字节的字模数据才能确定。
以下是DOS的图形模式下显示一个16×16点阵汉字时的描点顺序图。每两个字节的字模数据确定一行。
四、VB6中实现汉字字模转换的技巧
在许多工程控制的应用环境中,经常需要对标准的汉字字模进行调整和转换。
要对汉字字模进行转换首先应该正确地读出16点阵汉字在字库中的32字节的字模数据。设某一汉字的内码为ddff,其中dd表示区内码,ff表示位内码,则dd-&Ha1为该汉字的区码,ff-&Ha1为该汉字的位码。则该汉字在字库中的位置为:
Location = [(dd-&Ha1)×94 + (ff-&Ha1)]×32
需要注意的是,以何种方式从字库文件中读取这32字节也是一个关键问题。由于二进制(Binary)方式访问文件可以直接查看文件中指定的字节,而且二进制方式也是唯一支持用户到文件的任何位置读写任意长度数据的方法。因而以二进制方式打开汉字字库文件是最适合的。
VB6虽然提供了较强的位运算功能,但是对于在字模转换中使用较多的移位操作,却没有提供对应的移位运算符、指令或函数。其实通过and(与)、or(或)二个位运算符即可编制一个自定义子函数来实现移位运算。
下面的自定义子函数就是实现循环右移的:
Public Function byteRight(byte1 As Byte, n As Integer) As Byte '将byte1右移n位
Dim TemVar As Byte '临时变量
Dim TemVar1 As Byte '临时变量
Dim X, Y As Integer
TemVar = byte1
For X = 1 To n '移多少位就循环多少次
For Y = 1 To 8 '从第一位(右边第一位)开始循环右移
Select Case Y
Case 1
If (TemVar And &H1) = &H1 Then '如果临时变量TemVar的第一位是1,
TemVar1 = &H1 '则将临时变量TemVar1置1,
Else
TemVar1 = &H0 '则将临时变量TemVar1置0,
End If
Case 2
If (TemVar And &H2) = &H2 Then '如果临时变量TemVar的第二位是1,
TemVar = TemVar Or &H1 '则将其第一位置1(其它位不变),
Else
文章来源于领测软件测试网 https://www.ltesting.net/
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073