📄 点阵汉字显示.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0041)http://www.8623.com/article/hanzishow.htm -->
<HTML><HEAD><TITLE>点阵汉字显示</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META content="MSHTML 6.00.2800.1400" name=GENERATOR>
<META content=FrontPage.Editor.Document name=ProgId></HEAD>
<BODY text=#00ff00 bgColor=#000000>
<DIV align=center>
<TABLE width=640 border=0>
<TBODY>
<TR>
<TD>
<TABLE width="100%" border=0>
<TBODY>
<TR>
<TD>
<P align=center><FONT face=楷体_GB2312 color=#ffff00
size=7><B>点阵汉字显示</B></FONT></P></TD></TR>
<CENTER>
<TR>
<TD>
<P align=center><FONT color=#00ffff size=2>Little
Tiger Nov 16,2003</FONT></P></TD></TR></CENTER>
<TR>
<TD></TD></TR>
<TR>
<TD>
<P align=center><FONT size=3><A
href="http://www.8623.com/pro/hanzi.rar">点击下载示例程序</A></FONT></P></TD></TR>
<TR>
<TD></TD></TR>
<TR>
<TD><FONT size=3> 由于Turbo C应用于DOS操作系统下,在使用Turbo
C进行程序设计时,一般情况下只好使用英文进行人机交互。要是想直接用中文界面,就需要另想他法了。<BR> 如果使用中文DOS系统(如UCDOS),则可以解决在字符界面下的汉字显示问题。也就是说,可以用printf或其他字符串函数来输出汉字。<BR> 但是,这样仍然有一些不方便。必须先启动中文DOS系统,再执行Turbo
C或编译好的程序。并且在中文版DOS下运行Tubor
C时,还可能出现一些问题。而对于图形界面来说,这种办法也行不通了。<BR> 那么在图形界面下显示汉字的问题就迫切需要解决了。既然是图形界面,只要把汉字当成一幅画,画在显示屏上不就可以了。关键在于如何取得汉字的图形,也就是汉字的点阵字模呢。其实那些中文版的DOS显示汉字的方式也就是在图形界面下画出汉字的,它们已经提供了现成的点阵字库文件。例如常用的16×16点阵HZK16文件,12×12点阵HZK12文件等等,这些文件包括了GB
2312字符集中的所有汉字。现在只要弄清汉字点阵在字库文件中的格式,就可以按照自己的意愿去显示汉字了。<BR> 下面以HZK16文件为例,分析取得汉字字模的方法。<BR> HZK16文件是按照GB
2312-80标准,也就是通常所说的国标码或区位码的标准排列的。国标码分为 94 个区(Section),每个区 94
个位(Position),所以也称为区位码。其中01~09 区为符号、数字区,16~87 区为汉字区。而 10~15 区、88~94
区是空白区域。<BR> 如何取得汉字的区位码呢?在计算机处理汉字和ASCII字符时,使每个ASCII字符占用1个字节,而一个汉字占用两个字节,其值称为汉字的内码。其中第一个字节的值为区号加上32(20H),第二个字节的值为位号加上32(20H)。为了与ASCII字符区别开,表示汉字的两个字节的最高位都是1,也就是两个字节的值都又加上了128(80H)。这样,通过汉字的内码,就可以计算出汉字的区位码。<BR> 具体算式如下:<BR> qh=c1-32-128=c1-160
wh=c2-32-128=c2-160<BR> 或</FONT> <BR><FONT
size=3> qh=c1-0xa0
wh=c2-0xa0<BR> qh,wh为汉字的区号和位号,c1,c2为汉字的第一字节和第二字节。<BR> 根据区号和位号可以得到汉字字模在文件中的位置:<BR> location=(94*(qh-1)+(wh-1))*一个点阵字模的字节数。<BR> 那么一个点阵字模究竟占用多少字节数呢?我们来分析一下汉字字模的具体排列方式。<BR> 例如下图中显示的“汉”字,使用16×16点阵。字模中每一点使用一个二进制位(Bit)表示,如果是1,则说明此处有点,若是0,则说明没有。这样,一个16×16点阵的汉字总共需要16*16/8=32个字节表示。字模的表示顺序为:先从左到右,再从上到下,也就是先画左上方的8个点,再是右上方的8个点,然后是第二行左边8个点,右边8个点,依此类推,画满16×16个点。</FONT>
</TD></TR>
<TR>
<TD>
<P align=center><IMG height=129 src="点阵汉字显示.files/han.gif" width=129
border=0> </P></TD></TR>
<TR>
<TD>
<P
align=left> 对于其它点阵字库文件,则也是使用类似的方法进行显示。例如HZK12,但是HZK12文件的格式有些特别,如果你将它的字模当作12*12位计算的话,根本无法正常显示汉字。因为字库设计者为了使用的方便,字模每行的位数均补齐为8的整数倍,于是实际该字库的位长度是16*12,每个字模大小为24字节,虽然每行都多出了4位,但这4位都是0(不显示),并不影响显示效果。
还有UCDOS下的HZK24S(宋体)、HZK24K(楷体)或HZK24H(黑体)这些打印字库文件,每个字模占用24*24/8=72字节,不过这类大字模汉字库为了打印的方便,将字模都放倒了,所以在显示时要注意把横纵方向颠倒过来就可以了。<BR> 这样我们就完全清楚了如何得到汉字的点阵字模,这样就可以在程序中随意的显示汉字了。<BR> 如果在程序中使用的汉字数目不多,也可以不必总是在程序里带上几百K的字库文件,也许你的程序才只有几十K。这样可以事先将所需要显示的汉字字模提取出来,放在另一个文件里,按照自己的顺序读取文件就可以了。<BR> 下面的程序说明了具体显示汉字的方法,以16×16汉字为例,使用HZK16文件。<BR><BR>#include<stdio.h><BR>#include<graphics.h><BR><BR>/*
x,y为显示坐标,s为显示字符串,colour为颜色 */<BR>void hanzi16(int x,int y,char
*s,int colour)<BR>{<BR> FILE *fp;<BR> char
buffer[32];
/* 32字节的字模缓冲区 */<BR> register i,j,k;<BR> unsigned char
qh,wh;<BR> unsigned long
location;<BR> if((fp=fopen("hzk16","rb"))==NULL)<BR>
{<BR> printf("Can't open hzk16!");<BR>
getch();<BR> exit(0);<BR>
}<BR> while(*s)<BR> {<BR>
qh=*s-0xa0;<BR> wh=*(s+1)-0xa0;<BR>
location=(94*(qh-1)+(wh-1))*32L; /* 计算汉字字模在文件中的位置
*/<BR> fseek(fp,location,SEEK_SET);<BR>
fread(buffer,32,1,fp);<BR>
for(i=0;i<16;i++)<BR>
for(j=0;j<2;j++)<BR>
for(k=0;k<8;k++)<BR>
if(((buffer[i*2+j]>>(7-k))&0x1)!=NULL)<BR>
putpixel(x+8*j+k,y+i,colour);<BR> s+=2;<BR>
x+=16;
/* 汉字间距 */<BR>
}<BR> fclose(fp);<BR>}<BR><BR>main()<BR>{<BR> int
gd=DETECT,gm;<BR> initgraph(&gd,&gm,"");<BR><BR> hanzi16(246,200,"疯狂甲虫乐园!",BROWN);<BR><BR> getch();<BR> closegraph();<BR>}<BR></P></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></DIV></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -