二、确定汉字字符串的长度 各个版本的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返回字符串中实际汉字的数目。
汉字源文本输入框(SrcTxt)的Change事件中。通过判断输入在文本框内的字符的ASCII码是否小于零,就能判断输入的字符是不是汉字。这段程序还能计算汉字字符串的长度。同时把输入的汉字存储在一个临时文件TempSrc.txt中。由于这段代码是放在文本框的Change事件中,它能立即更新汉字个数的显示。 Private Sub SrcTxt_Change( ) Static SStr As String Dim i As Integer Dim TempFile, TempFileBinary As String TotalNum = 0 L = Len(SrcTxt.Text) For i = 1 To L tmpStr = StrConv(Mid$(SrcTxt.Text, i, 1), vbWide) If Asc(Mid$(SrcTxt.Text, i, 1)) < 0 Then TotalNum = TotalNum + 1 SStr = SrcTxt.Text Else MsgBox "写入的不是汉字!" SrcTxt.Text = Left(SrcTxt.Text, Len(SrcTxt.Text) - 1) Exit Sub End If Next i LblNum.Caption = Str$(TotalNum) + "个汉字" TempFile = App.Path + "\" + "TempSrc.txt" 'TempFileBinary = App.Path + "\" + "TempSrcBinary.txt" Open TempFile For Output As #1 Print #1, SrcTxt.Text Close #1 End Sub
四、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 TemVar = TemVar And &HFE '反之将第一位置0(其它位不变) End If Case 3 If (TemVar And &H4) = &H4 Then '操作与上面相同 TemVar = TemVar Or &H2 Else TemVar = TemVar And &HFD End If Case 4 If (TemVar And &H8) = &H8 Then TemVar = TemVar Or &H4 Else TemVar = TemVar And &HFB End If Case 5 If (TemVar And &H10) = &H10 Then TemVar = TemVar Or &H8 Else TemVar = TemVar And &HF7 End If Case 6 If (TemVar And &H20) = &H20 Then TemVar = TemVar Or &H10 Else TemVar = TemVar And &HEF End If Case 7 If (TemVar And &H40) = &H40 Then TemVar = TemVar Or &H20 Else TemVar = TemVar And &HDF End If Case 8 If (TemVar And &H80) = &H80 Then TemVar = TemVar Or &H40 Else TemVar = TemVar And &HBF End If If TemVar1 = &H1 Then '移完第八位后,如果TemVar1是1(即第一位是1) TemVar = TemVar Or &H80 '则将TemVar的第八位置1 Else TemVar = TemVar And &H7F '反之置0 End If End Select Next Y Next X byteRight = TemVar '将TemVar的值返回给函数名 End Function 尤其需要注意的是当把二进制数据写入文件中时,必须使用Byte数据类型的数组变量,而不是 String 变量。 String 被认为包含的是字符,而二进制型数据可能无法正确地存在 String 变量中。
2、实际源程序 以下这段程序是放置在汉字源文本输入框(SrcTxt)的Change事件中。通过判断输入在文本框内的字符的ASCII码是否小于零,就能判断输入的字符是不是汉字。这段程序还能计算汉字字符串的长度。同时把输入的汉字存储在一个临时文件TempSrc.txt中。由于这段代码是放在文本框的Change事件中,它能立即更新汉字个数的显示。 Private Sub SrcTxt_Change( ) Static SStr As String Dim i As Integer Dim TempFile, TempFileBinary As String TotalNum = 0 L = Len(SrcTxt.Text) For i = 1 To L tmpStr = StrConv(Mid$(SrcTxt.Text, i, 1), vbWide) If Asc(Mid$(SrcTxt.Text, i, 1)) < 0 Then TotalNum = TotalNum + 1 SStr = SrcTxt.Text Else MsgBox "写入的不是汉字!" SrcTxt.Text = Left(SrcTxt.Text, Len(SrcTxt.Text) - 1) Exit Sub End If Next i LblNum.Caption = Str$(TotalNum) + "个汉字" TempFile = App.Path + "\" + "TempSrc.txt" 'TempFileBinary = App.Path + "\" + "TempSrcBinary.txt" Open TempFile For Output As #1 Print #1, SrcTxt.Text Close #1 End Sub 网上的例子多的是 完
在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并没有提供专门的函数和方法。
网上的例子多的是
完