📄 visual basic6编程中的汉字处理 ----- 程序设计联盟 - pgsun_com.htm
字号:
</P>
<P> VB6虽然提供了较强的位运算功能,但是对于在字模转换中使用较多的移位操作,却没有提供对应的移位运算符、指令或函数。其实通过and(与)、or(或)二个位运算符即可编制一个自定义子函数来实现移位运算。
</P>
<P> 下面的自定义子函数就是实现循环右移的: <BR> Public Function byteRight(byte1
As Byte, n As Integer) <BR>As Byte '将byte1右移n位 <BR> Dim
TemVar As Byte '临时变量 <BR> Dim TemVar1 As Byte '临时变量 <BR> Dim
X, Y As Integer <BR> TemVar = byte1 <BR> For X = 1 To n
'移多少位就循环多少次 <BR> For Y = 1 To 8 '从第一位(右边第一位)开始循环右移
<BR> Select Case Y <BR> Case 1 <BR> If (TemVar And &H1)
= &H1 Then '如果临时变量TemVar的第一位是1, <BR> TemVar1 = &H1
'则将临时变量TemVar1置1, <BR> Else <BR> TemVar1 = &H0
'则将临时变量TemVar1置0, <BR> End If <BR> Case 2 <BR> If (TemVar
And &H2) = &H2 Then '如果临时变量TemVar的第二位是1, <BR> TemVar
= TemVar Or &H1 '则将其第一位置1(其它位不变), <BR> Else<BR>TemVar =
TemVar And &HFE '反之将第一位置0(其它位不变) <BR> End If <BR> Case 3
<BR> If (TemVar And &H4) = &H4 Then '操作与上面相同
<BR> TemVar = TemVar Or &H2 <BR> Else <BR> TemVar =
TemVar And &HFD <BR> End If <BR> Case 4 <BR> If (TemVar
And &H8) = &H8 Then <BR> TemVar = TemVar Or &H4
<BR> Else <BR> TemVar = TemVar And &HFB <BR> End If
<BR> Case 5 <BR> If (TemVar And &H10) = &H10 Then
<BR> TemVar = TemVar Or &H8 <BR> Else <BR> TemVar =
TemVar And &HF7 <BR> End If <BR> Case 6 <BR> If (TemVar
And &H20) = &H20 Then <BR> TemVar = TemVar Or
&H10 <BR> Else <BR> TemVar = TemVar And &HEF
<BR> End If <BR> Case 7 <BR> If (TemVar And &H40) =
&H40 Then <BR> TemVar = TemVar Or &H20 <BR> Else
<BR> TemVar = TemVar And &HDF <BR> End If <BR> Case 8
<BR> If (TemVar And &H80) = &H80 Then <BR> TemVar =
TemVar Or &H40 <BR> Else <BR> TemVar = TemVar And
&HBF <BR> End If <BR> If TemVar1 = &H1 Then
'移完第八位后,如果TemVar1是1(即第一位是1) <BR> TemVar = TemVar Or &H80
'则将TemVar的第八位置1 <BR> Else <BR> TemVar = TemVar And &H7F
'反之置0 <BR> End If <BR> End Select <BR> Next Y <BR> Next X
<BR> byteRight = TemVar '将TemVar的值返回给函数名 <BR> End Function
<BR> 尤其需要注意的是当把二进制数据写入文件中时,必须使用Byte数据类型的数组变量,而不是 String 变量。
<BR>String 被认为包含的是字符,而二进制型数据可能无法正确地存在 String 变量中。
<BR> 五、一个实际应用案例
<BR> 图形点阵液晶在现代单片机系统中是一种十分常用的显示设备,BP机、手机上的显示屏就是图形点阵液晶。它能显示汉字和图形,与行列式键盘组成了单片机系统中最常用的人机交互界面。但是直接从中文系统汉字字库中提取的汉字字模并不能直接在液晶上显示,通常都必须经过格式上的调整和转换。
</P>
<P> 1、图形点阵液晶的汉字字模
<BR> 与在西文DOS中显示汉字不同的是,图形点阵液晶并不是简单地用画点的方式来描出汉字。以常用的HD61202图形点阵液晶显示控制模块为例,它能控制64×64点阵液晶的显示,其显示RAM共64行,分8页,每页8行,每一页的数据寄存器分别对应液晶屏幕上的8行点,对显示RAM的一个字节单位赋值就是对当前列的8行(一页)的像素点是否显示进行控制。连续16列和相邻的2页的32字节显示RAM就可以控制一个汉字的显示区域。对这些显示RAM赋以相应的值就可以显示出一个汉字。
</P>
<P> HD61202图形点阵液晶显示控制模块的汉字字模的排列实际上是标准汉字字模排列形式旋转而成的。对标准汉字字模转换的目的就是在单片机系统的数据存储器中(如E2PROM)存储经过调整的连续32字节的16进制数。
</P>
<P> 2、实际源程序
<BR> 以下这段程序是放置在汉字源文本输入框(SrcTxt)的Change事件中。通过判断输入在文本框内的字符的ASCII码是否小于零,就能判断输入的字符是不是汉字。这段程序还能计算汉字字符串的长度。同时把输入的汉字存储在一个临时文件TempSrc.txt中。由于这段代码是放在文本框的Change事件中,它能立即更新汉字个数的显示。
</P>
<P> Private Sub SrcTxt_Change( ) <BR> Static SStr As String
<BR> Dim i As Integer <BR> Dim TempFile, TempFileBinary As
String <BR> TotalNum = 0 <BR> L = Len(SrcTxt.Text) <BR> For
i = 1 To L <BR> tmpStr = StrConv(Mid$(SrcTxt.Text, i, 1),
vbWide) <BR> If Asc(Mid$(SrcTxt.Text, i, 1)) < 0 Then
<BR> TotalNum = TotalNum + 1 <BR> SStr = SrcTxt.Text
<BR> Else <BR> MsgBox "写入的不是汉字!" <BR> SrcTxt.Text =
Left(SrcTxt.Text, Len(SrcTxt.Text) - 1) <BR> Exit Sub
<BR> End If <BR> Next i <BR> LblNum.Caption =
Str$(TotalNum) + "个汉字" <BR> TempFile = App.Path + "\" +
"TempSrc.txt" <BR> 'TempFileBinary = App.Path + "\" +
"TempSrcBinary.txt" </P>
<P> Open TempFile For Output As #1 <BR> Print #1,
SrcTxt.Text <BR> Close #1 <BR> End Sub <BR> 在实例中选用了UCDOS
5.0汉字系统中的16点阵字库Hzk16作为提取汉字字模的标准字库。 <BR> Private Sub
CmdCnt_Click( ) <BR> Dim TempSrcFile As String <BR> Dim
TempDestFile As String <BR> Dim TempFile As String <BR> Dim
HzFile As String <BR> Dim To61202(32) As Integer <BR> Dim
p(1 To 2) As Byte <BR> Dim C1, C2 <BR> Dim rec As Integer
<BR> Dim Location As Long '汉字在字库中的位置 <BR> Dim Hz(0 To 31) As
Byte '转换完的32字节的字模数据 <BR> Dim Buf1(0 To 31) As Byte
'暂存转换过程中的32字节字模数据 <BR> Dim HzAll( ) As Byte '存放全部字模数据的动态数组
<BR> Dim LoopAll As Integer <BR> Dim bit, k2, k3 As Byte
<BR> Dim i, j, i1, k, k1, k4, k5, k6 As Integer
<BR> DestTxt.Text = "" 'DestTxt是目标文本框,存放转换后的16进制数据 <BR> Flag
= 0 <BR> TempDestFile$ = App.Path + "\" + "TempDest.txt"
<BR> If FileExists(TempDestFile$) Then Kill TempDestFile
<BR>'FileExists是一个检查文件是否存在的自定义函数 <BR> If SrcTxt.Text = ""
Then '汉字输入框内无汉字则退出 <BR> MsgBox "没有可以转换的字模源文件!" <BR> Exit Sub
<BR> End If <BR> HzNum = Len(SrcTxt.Text) '获得汉字的个数
<BR> ReDim HzAll(0 To HzNum * 32 - 1) '重新定义动态数组的上界 <BR> Open
TempFile For Output As #1 <BR> Print #1, SrcTxt.Text
<BR> Close #1 <BR> For LoopAll = 0 To HzNum - 1 <BR> Open
TempFile For Binary Access Read As #1 '按二进制方式打开 <BR> Get #1,
2 * LoopAll + 1, p <BR> Close #1 <BR> C1 = CStr(p(1)) -
&Ha1 '区内码 <BR> C2 = CStr(p(2)) - &Ha1 '位内码 <BR> rec
= C1 * 94 + C2 <BR> Location = CLng(rec) * 32 + 1
<BR>'该汉字在16*16点阵字库中字模第一个字节的位置 <BR> HzFile = App.Path + "\" +
"hzk16" <BR> Open HzFile For Binary Access Read As #1
<BR>'读取该汉字在16点阵字库中的原始字模 <BR> Get #1, Location, Hz <BR> Close
#1 <BR> '以下是将UCDOS字库的存储格式调整为HD61202的规范格式 <BR> For j = 0 To 3
<BR> If j = 0 Then k4 = 14 <BR> If j = 1 Then k4 = 15
<BR> If j = 2 Then k4 = 30 <BR> If j = 3 Then k4 = 31
<BR> For k = 0 To 7 <BR> bit = &H80 <BR> bit =
byteRight((bit), (k)) <BR> For i = 0 To 7 <BR> k2 =
byteleft(Buf1(j * 8 + k), 1) <BR>'整个流程是由低位向高位移动,最后凑成一个字节
<BR> k3 = byteRight((Hz(k4 - i * 2) And bit), 7 - k)
<BR>'将字节中的某位移到最低位 <BR> k3 = k3 And &H1 '屏蔽掉其余7位
<BR> Buf1(j * 8 + k) = k2 Or k3 <BR> Next i <BR> Next k
<BR> Next j <BR> For i1 = 0 To 31 '将调整后的汉字字模再装入原数组
<BR> Hz(i1) = Buf1(i1) <BR> HzAll(LoopAll * 32 + i1) =
Buf1(i1) <BR> Next <BR> Next LoopAll <BR> Open TempDestFile
For Binary Access Write As #1 <BR>'转换结果保存到TempDestFile中
<BR> Put #1, 1, HzAll <BR> Close #1 <BR> MsgBox "OK!"
<BR> End Sub <BR> 以上程序均在中文VB6专业版上调试通过。
<BR> 以上程序在实用中取得了很好的效果。此汉字字模转换程序丰富了单片机系统开发工具的功能,是包含液晶显示功能的单片机系统在系统调试和开发过程中不可或缺的功能模块。<BR></P></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=5 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD align=right>作者: 不详<BR>来源:不详</TD></TR></TBODY></TABLE>
<TABLE cellSpacing=1 cellPadding=0 width="100%" bgColor=#cccccc
border=0>
<TBODY>
<TR>
<TD bgColor=#ffffff height=20>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD width="64%"
height=23><B> </B>声明:本站部分资源来源自互联网,如有侵权请与我们联系!</TD>
<TD width="10%"><A onclick='javascript:SaveAs(" ","")'
href="http://www.pgsun.com/doc/200513/20051126840166.htm#">保存文章</A></TD>
<TD width="10%"><A onclick=window.print();
href="http://www.pgsun.com/doc/200513/20051126840166.htm#">打印文章</A></TD>
<TD width="16%"><A
href="javascript:window.close()">关闭窗口</A></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<SCRIPT language=javascript src=""></SCRIPT>
</TD>
<TD width=1></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width=762 align=center bgColor=#ffffff
border=0>
<TBODY>
<TR>
<TD width=1></TD>
<TD bgColor=#333333 height=25>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD vAlign=bottom height=25>
<TABLE height=21 cellSpacing=0 cellPadding=0 width="100%"
border=0><TBODY>
<TR>
<TD align=middle height=21>
<DIV align=center><A href="http://www.pgsun.com/"><FONT
color=#ffffff>
<SCRIPT language=javascript
src="Visual Basic6编程中的汉字处理 ----- 程序设计联盟 - PGSUN_com.files/adv_down.js"></SCRIPT>
</FONT></A><FONT
color=#ffffff></FONT></DIV></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD>
<TD width=1></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width=762 align=center bgColor=#ffffff
border=0>
<TBODY>
<TR>
<TD height=1></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width=762 align=center bgColor=#ffffff
border=0>
<TBODY>
<TR>
<TD width=1 height=46></TD>
<TD
background="Visual Basic6编程中的汉字处理 ----- 程序设计联盟 - PGSUN_com.files/top_01.jpg"
height=52>
<TABLE width="100%" border=0>
<TBODY>
<TR>
<TD align=left width="46%"><B> </B>Copyright© 2005 <STRONG><A
href="http://www.pgsun.com/"><FONT color=#000000>www.<FONT
color=#ff0000>P</FONT>GSUN.com</FONT></A></STRONG> All Rights
Reserved<BR><B> </B>建议使用IE5.0以上, 分辩率800×600 </TD>
<TD align=middle width="54%"> </TD></TR></TBODY></TABLE></TD>
<TD width=1></TD></TR></TBODY></TABLE></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -