在计算机中英文可以使用 ASCII 码来表示,而汉字使用的是扩展 ASCII 码,并且使用两个扩展 ASCII 码来表示一个汉字。一个 ASCII 码使用一个字节表示,所谓扩展 ASCII 码,也就是 ASCII 码的最高位是1的 ASCII 码,简单的说就是码值大于等于 128 的 ASCII 码。一个汉字由两个扩展 ASCII 码组成,第一个扩展 ASCII 码用来存放区码,第二个扩展 ASCII 码用来存放位码。在 GB2312-80 标准中,将所有的汉字分为94个区,每个区有94个位可以存放94个汉字,形成了人们常说的区位码,这样总共就有 94*94=8836 个汉字。在点阵字库中,汉字点阵数据就是按照这个区位的顺序来存放的,也就是最先存放的是第一个区的汉字点阵数据,在每一个区中有是按照位的顺序来存放 的。在汉字的内码中,汉字区位码的存放实在扩展 ASCII 基础上存放的,并且将区码和位码都加上了32,然后存放在两个扩展 ASCII 码中。具体的说就是:
第一个扩展ASCII码 = 128+32 + 汉字区码
第二个扩展ASCII吗 = 128+32 + 汉字位码
如果用char hz[2]来表示一个汉字,那么我可以计算出这个汉字的区位码为:
区码 = hz[0] - 128 - 32 = hz[0] - 160
位码 = hz[1] - 128 - 32 = hz[1] - 160。
这样,我们可以根据区位码在文件中进行殉职了,寻址公式如下:
汉字点阵数据在字库文件中的偏移 = ((区码-1) * 94 + 位码) * 一个点阵字模占用的字节数
在寻址以后,即可读取汉字的点阵数据到缓冲区进行显示了。以下是实现代码:
/* 输出一个汉字的函数 */
void _draw_hz(char hz[2], FILE *fp, int x, int y, int w, int h, int color)
{
char fontbuf[128]; /* 足够大的缓冲区,也可以动态分配 */
int ch0 = (BYTE)hz[0]-0xA0; /* 区码 */
int ch1 = (BYTE)hz[1]-0xA0; /* 位码 */
/* 计算偏移 */
long offset = (long)pf->_hz_buf_size * ((ch0 - 1) * 94 + ch1 - 1);
fseek(fp, offset, SEEK_SET); /* 进行寻址 */
fread(fontbuf, 1, (w + 7) / 8 * h, fp); /* 读入点阵数据 */
_draw_model(fontbuf, w, h, x, y, color); /* 绘制字模 */
}
以上介绍完了中文点阵字库的原理,当然还有英文点阵字库了。英文点阵字库中单个点阵字模数据的存放方式与中文是一模一样的,也就是对我们所写的 _draw_model 函数同样可以使用到英文字库中。唯一不同的是对点阵字库的寻址上。英文使用的就是 ASCII 码,其码值是0到127,寻址公式为:
英文点阵数据在英文点阵字库中的偏移 = 英文的ASCII码 * 一个英文字模占用的字节数
可以看到,区分中英文的关键就是,一个字符是 ASCII 码还是扩展 ASCII 码,如果是 ASCII 码,其范围是0到127,这样是使用的英文字库,如果是扩展 ASCII 码,则与其后的另一个扩展 ASCII 码组成汉字内码,使用中文字库进行显示。只要正确区分 ASCII 码的类型并进行分别的处理,也就能实现中英文字符串的混合输出了。
另外,一个 m*n 的点阵所占用的字节数为 (m+7)/8*n。
分享到:
相关推荐
支持16*16和32*32的两种点阵汉字库,本人已经过了测试很好用
在单片机液晶中,如何显示点阵汉字,给大家提供了: 1. 含有16X16的标准点阵汉字库 2. 含有读取该点阵字库的C语言程序
点阵汉字库生成
Unicode编码下的16*16点阵汉字库(先左后右先上后下),宋体12号或小4字体大小(简体)。取码范围0X4E00-0X9FFF
在开发工控系统时常常需要制作点阵小汉字库,本工具可在Win环境下利用Windows系统自身的字库自动生成小字库,并可随意修改编辑...
汉字点阵数据生成工具,绿色版,我一直在用,是对液晶LCD数据生成的一种工具。
GB2312编码下的16*16点阵汉字库(先左后右先上后下),宋体12号或小4字体大小(简体)
汉字字模点阵数据批量生成工具安装程序.exe
基于ARM平台的汉字点阵数据的LCD显示程序,通过汉字字模点阵数据批量生成工具,将需要的汉字生成点阵数据,放到ARM7定义的数组中,并在LCD上显示出来。
汉字点阵库 12X12 的点阵汉字库,需要的可以下来看看,干嘛要20个汉字的说明啊 ,晕死
汉字字模点阵数据批量生成工具 汉字字模点阵数据批量生成工具
最全的字母、汉字点阵库大全: HZK16S 宋体 HZK16F 仿宋 HZK16H 黑体 HZK16K 楷体 HZK16Y 幼圆 HZK16L 隶书 HZK16C 粗体 HZK16X 细 HZK16V 繁 HZK24F 24x24 仿宋汉字打印点阵 一个汉字72Byte HZK24H 24x24 黑体汉字...
C源代码:12x12汉字点阵库(支持GBK)及其处理
GB2312标准字库,包含 HZK12*12 16*16 32*32 40*40 48*48,包含宋体 楷书等常用字体
16x16点阵汉字库点阵显示程序,内含16x16的国标汉字库hzk16文件 [root@jocks show1616]# ./a.out "中" // 中 0x01,0x00, // 0000000100000000 0x01,0x00, // 0000000100000000 0x01,0x04, // 0000000100000100 0x7f,...
支持 RS232串口通讯、可把字模数据发送到移动存储设备集成汉字自动识别功能,清除非汉字字符,提取汉字功能 适合用于产生点阵LED大屏幕、LCD液晶汉字字模,可用作开发辅助工具,得到精减汉字库,节约有限的ROM空间...