|
本人在DOS下用TC实现汉字显示方法如下:
汉字库生成及汉字图形显示原理
1、汉字库的提取:
由于本次前期实验工作是在MS-DOS6.22平台下进行,没有汉字库。汉字库的生成在高版本的Windows下生成,而各汉字系统汉字库的组织方式不完全一致,字库码的计算公式也因汉字系统不同而有些差异。在此前期实验工作中,我使用以下此方法计算孩子的字库码。根据汉字的机内码运用公式“区位码=汉字机内码-0xa0a0”先计算出其区位码,再运用公式“字库码=(区码-1)×94+(位码-1)”计算出其字库码,也就是其偏移地址。知道汉字的字库码和存储一个汉字字形所用的字节数(简称字节数)后,运用计算公式“字形码字节偏移地址=字库码×(字节数/1个汉字字形)”计算出该汉字字形码(点阵信息)在字库中的偏移地址。移动文件指针至字库中该汉字的字节偏移处,并读取单位汉字字形占用的字节数。
实现方法:
(1) 汉字字库码的计算:
gb=(ch1-160)*100+ch2-160;
x=gb/100;y=gb%100;
p=((x-1)*94+y-1)*32;
(2)根据字库码获取该汉字的地址
fseek(fplib,addr,SEEK_SET);
2、建立一个我们所需的小型汉字库
实现方法:
将需要用到的汉字写到一个txt文件中,经过CRTLIB.EXE程序生成一个CCLIB.xx汉字库文件
3、从生成的小型汉字库提取汉字并显示字形信息。
实现方法:
提取汉字并保存于文件CCLIB.xx中
fwrite(&ch1,1,1,fplib);
fwrite(&ch2,1,1,fplib);
write(&s,72,1,fplib);
并编译生成CRTLIB.EXE可执行文件。
汉字的图形显示:
我们选择点阵字库来显示汉字的图形,点阵字库存储汉字点阵信息,我们只用到16×16,24×24两种点阵。16×16点阵是一种简易字形点阵,但字形不美观。其点阵是按横向设计的,共有32bytes。24×24点阵字形比较美观,主要用于打印。其每个汉字为72bytes,按照打印机的打印针头排列,为竖直方向,即一列有3bytes。汉字的显示过程就是把汉字的机内码转换为屏幕上的汉字字形点阵的过程。CRT控制模块接收汉字机内码,由字形检索程序检索程序把机内码转换为相应的汉字字模在汉字库中的地址。由此地址从字库中取出汉字字模,经缓冲区处理形成汉字字形码,经显示驱动程序把字形码显示在屏幕上。
实现方法:
定义outhz ()为从汉字库中输出汉字,img()为画点函数,oouthz()为向显示屏输出汉字函数。具体定义如下:
8×8点阵西文与数字:void oouthz8(unsigned char *,int,int,int,int,int,int);
void outhz8(unsigned char *,int,int,int,int,int,int);
void img8(unsigned char *,int,int,int,int);
16×16点阵汉字:void oouthz16(unsigned char *,int,int,int,int,int,int);
void outhz16(unsigned char *,int,int,int,int,int,int);
void img16(unsigned char *,int,int,int,int);
24×24点阵汉字:void oouthz24(unsigned char *,int,int,int,int,int,int);
void outhz24(unsigned char *,int,int,int,int,int,int);
void img24(unsigned char *,int,int,int,int);
试问,在LINUX下要如何实现这个汉字显示呢!?本人刚接触LINUX,很多都不懂,希望大家多多指导~~~ |
|