单片机LED三维动态信息显示系统 第7页

单片机LED三维动态信息显示系统 第7页
15
3.2.2汉字内码与区位码的关系
汉字经过了几千年的演变与发展,在这一过程中汉字的数量不断增加,常用的汉字大
约有六千多个。1981年我国正式发布了国家标准——《通讯用汉字编码字符集(基本集)
及其交换标准》[GB2312-80]方案。在GB2312-80中,总共收入汉字数为6763个,将比
较常用的3755个列为一级汉字,将其余3008个列为二级汉字,而且一级汉字的排序按照
拼音顺序,二级汉字的排序采用部首顺序。GB2312用两个字节表示一个汉字代码,总共
规定了94×94=8836个代码,中间有一些空代码即没有对应汉字。GB2312编码的前一个
字节称为区码,后一个称为位码,因为GB2312把汉字分为94个区,每个区又有94个汉
字,所以每个汉字用GB2312来表示时,就是采用“区码+位码”的方式。GB2312的前
1~9区为图形字符区,包括标点符号、其它各种文字如日文假名、罗马字母、俄文、制表
符等。从16区开始以后才是汉字,10~15区没有使用
[24]

计算机在显示某汉字时,首先是读取这一汉字的机内码,由于该汉字的机内码与区位
码之间有一定的关系,然后根据该机内码求出汉字的区码和位码,从而得出该汉字字模在
字库中存放的地址。所以只要通过汉字的机内码就可以得到该汉字的区位码,从而也可以
获得该汉字的字模。机内码与区位码的关系用公式表示为:
机内码高位=区码+AOH
机内码低位=位码+AOH
该字在字库中的记录号为(这里采用的是UCDOS7.0中的字库HZK16):
记录号=区码×94+位码
得到记录号后乘以32即为该汉字在16×16点阵字库中字模第一个字节的位置,最后
从该地址起连续读取一定数量单位的数据(即字模)进行显示即可。
3.2.3汉字点阵字模的显示
一般情况下,汉字在计算机中处理时是采用
图形的方法,即每个汉字就是一个图形。显示一
个汉字就是显示一个图形,这个图形符号称为汉
字字模。每个汉字在计算机中都对应一个字模,
字模分为两种类型,一种是点阵字模,一种是矢
量字模。点阵汉字是汉字字型最基本的表示法
[25]
。点阵字模的原理是把汉字的方形区域细分
为若干个小方格,每个小方格便是一个基本点。
在方形范围内,凡笔画经过小方格便形成黑点,
图3-1 16×16点阵示例
Fig.3-1 16×16 lattice figure西安理工大学硕士学位论文
16
不经过的形成白点。若黑点代表1,白点代表0,那么小方格恰好可以用一个二进制位来
表示。这样制作出来的汉字称为点阵汉字,如图3-1是“大”字16×16点阵模式排列放
大后的结果。
对于点阵汉字来说,一个汉字的字模(如16×16,24×24,32×32)都有固定的字节
数。大多数字库文件都不进行压缩,所以采用顺序存储方式,即先存储区位码为0101的
汉字字模,紧接着0102,0103,一直到0194,下一个是0201,……直到第87汉字区。
值得注意的是,有些字库文件中10~15区没有汉字,有些字库文件还常有文件头,写着
有关字库的一些信息。
3.3点阵代码的提取
课题设计中用到的都是16×16汉字字模点阵字库。因此应先取得输入汉字的区位码,
对于字库HZK16,汉字内码与区位码之间的转换关系为:
区码=汉字机内码的高字节-A1H
位码=汉字机内码的低字节-A1H
进行计算后,得到此汉字字模在点阵字库中的偏移量为:
Offset=(区码×94+位码)×32
然后将对应的点阵信息读出并存储,16×16点阵汉字字模的每一横行占两个字节。
也就是说16×16大方格的第一横行的黑白点是由这两个字节来决定的。将其数字转化为
二进制,0的地方不填充,1的地方填充为黑色,如此循环把16格全填充好后,画出了汉
字的第一横行。然后逐个读取字模,将16行全部画出来,这样就显示了一个完整的汉字。
在这里将采用VB软件直接从字库中提取标准的汉字字模代码,因为存放16点阵汉
字的字库在中文操作软件如UCDOS7.0中可以找到现成的文件HZK16。这些字模代码都
是按照区位码的顺序在字库以二进制格式存储的,每个汉字占用32个Byte。因此只要找
到汉字代码的起始位置,就可以正确提取汉字点阵信息了。需要注意的是对于不同的字库,
汉字代码起始位置的计算方法可能存在差异,例如HZK16和CCLIB.DOT。在VB中,可
以用Asc()函数来获取汉字的区位码,当汉字作为它的参数时,返回的是汉字的机内码。
经Hex()函数转换即可得到该汉字机内码的十六进制数,再通过机内码、国标码和区位码
之间的换算关系就可以得到该汉字的首地址。在字库文件中从汉字的首地址开始到第32
个字节就是该汉字的代码。
3.4字模转置的算法研究
一般情况下,汉字字模的显示方式采取的是从左到右,自上而下的打点扫描。例如计
算机对一个16×16点阵字模进行显示时,其显示方式是:在水平方向扫描共打16个点即3汉字点阵字模的获取
17
两个字节,一行扫描结束后,再扫描下一行,一共扫描16行。而在有些情况下对字模的
扫描采取的是自上而下,从左到右的列扫描,如图3-2所示。
因此需要对提取出来的字模进行转
置处理。在参考前人工作的基础上,采用
了一种新算法,该算法主要是应用了C语
言的嵌套循环语句,并配合左右移语句以
完成对转置的实现[26]。下面就是该算法的
简要论述:将Windows环境下利用VB提
取出来的字模点阵的第0、2、…、14个
字节的最高位bit7取出,依次作为一个新
字节的bit7、bit6、…、bit0,这样形成的
新字节为对应转置字模的第1个字节;将
第16、18、…、30个字节的bit7取出,
依次作为一个新字节的bit7、bit6、…、bit0,
这样形成的新字节为对应转置字模的第2个字节;再将提取出来的字模点阵的第0、2、…、
14个字节的bit6位取出,依次作为一个新字节的bit7、bit6、…、bit0,这样就形成了对
应转置字模的第3个字节;依次类推直到将转置字模的第17、19、…、31字节的bit0取
出,依次作为一个新字节的bit7、bit6、…、bit0,这样就形成了对应转置字模的第32个
字节。这32个字节内容即为所要获取的16×16点阵汉字显示转置字模。实现上述思路的
程序清单如下:
void change(char Old-lat[],char New-lat[])
{unsigned char mask[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
unsigned char a,b=0;
int i,j,k,m,n=0;
for(k=0;k≤1;k++)
for(j=0;j≤1;j++)
for(m=0;m<8;m++,n++)
{b=0;
for(i=0;i<8;i++)
{a=Old-mat[2*(8*k+i)+j]&mask[m];
if(m>i)a=a<<(m-i);`a中的数值左移(m-i)位
if(m<i)a=a>>(i-m);`a中的数值右移(m-i)位
b=b+a;}
New-lat[n]=b;}}
图3-2转置后的排列顺序表
Fig.3-2 Regulated order figure西安理工大学硕士学位论文
3.5软件实现过程
3.5.1横排的汉字点阵字模的获取
以下便是在VB的Click事件驱动过程中所编写的源代码,当输入要提取字模点阵的
汉字并点击应用程序界面中的“提取”按钮时,就会引发Click事件。VB应用程序将自
动执行以下代码,并在程序界面的文本显示栏中显示提取出来的汉字字模点阵的代码。如
图3-3所示。
汉字由参量MY-HZ传入程序,通过Hex(Asc(MY-HZ))语句得到汉字的机内码,在
求出其区码和位码的同时利用上面的公式便可得到汉字的字模点阵在字库HZK16中的具
体位置[27]。在取得汉字的字模点阵后,将点阵数据存放在数组变量ZMDZ中。
Private Sub Get-ZM(MY-HZ As String)
Dim JNM As Variant,QWM As Variant`定义JNM为机内码,QWM为区位码
Dim QM As Variant,WM As Variant`定义QM为区码,WM为位码
Dim ADDR As Variant
Dim I As Variant,J As Variant,BYTES()As Byte,ZMDZ(1 to 32)As Byte
JNM=Hex(Asc(MY-HZ))
QWM=Hex(Asc(MY-HZ)-&HA1A1)`机内码-A1A1=区位码
If Len(QWM)=3 Then`通过区位码得到区码和位码
QM=Mid(QWM,1,1)WM=Mid(QWM,2,2)
ElseIf Len(QWM)=4 Then
QM=Mid(QWM,1,2)WM=Mid(QWM,3,2)
End If
图3-3横排字模的提取
Fig.3-3 The abstraction of Chinese character lattice

上一页  [1] [2] [3] [4] [5] [6] [7] [8] [9] [10]  ... 下一页  >> 

Copyright © 2007-2012 www.chuibin.com 六维论文网 版权所有