先讲讲什么是点阵字库,首先需要理解的是点阵字库是一个数据文件,在这个数据文件里面保存了所有文字的点阵数据。
至于什么是点阵,不讲大家都知道的。
在 PC 机上也是如此,文字也是由点阵来组成了,不同的是,PC机显示器的显示分辨率更高,高到了我们肉眼无法区分的地步,因此“点阵”的痕迹也就不那么明显了。
点阵、矩阵、位图这三个概念在本质上是有联系的,从某种程度上来讲,这三个就是同义词。
点阵从本质上讲就是单色位图,他使用一个比特来表示一个点,如果这个比特为0,表示某个位置没有点,如果为1表示某个位置有点。矩阵和位图有着密不可分的联系,矩阵其实是位图的数学抽象,是一个二维的阵列。
位图就是这种二维的阵列,这个阵列中的(x,y)位置上的数据代表的就是对原始图形进行采样量化后的颜色值。
但是,另一方面,我们要面对的问题是,计算机中数据的存放都是一维的,线性的。因此,我们需要将二维的数据线性化到一维里面去。通常的做法就是将二维数据按行顺序的存放,这样就线性化到了一维。
那么点阵字的数据存放细节到底是怎么样的呢。其实也十分的简单,举个例子最能说明问题。比如说16*16的点阵,也就是说每一行有16个点,由于一个点使用一个比特来表示,如果这个比特的值为1,则表示这个位置有点,如果这个比特的值为0,则表示这个位置没有点,那么一行也就需要16个比特,而8个比特就是一个字节,也就是说,这个点阵中,一行的数据需要两个字节来存放。第一行的前个点的数据存放在点阵数据的第一个字节里面,第一行的后面个点的数据存放在点阵数据的第二个字节里面,第二行的前个点的数据存放在点阵数据的第三个字节里面,...,然后后面的就以此类推了。这样我们可以计算出存放一个点阵总共需要32个字节。
C语言显示汉字字库就成为了当时必然的选择。在计算机发展的早期,为了支持显示汉字,国内发明了相应的2个字节表示的汉字国标(GB)码,根据这个编码规则,汉字分为94个区,每区94个汉字,汉字在其所在区内的位置用位号表示,两个字节分别表示区号和位号,为了区分ASCII码,每个字节的首位都被置为1。在网络传输时还有特定的区分方法,这里不细述这些细节了。在国际编码中,中国汉字被分配到第16区(起始区号0x0F)。为了显示汉字,需要汉字字形文件(字库)的支持。
接下来的问题就是如何在汉字库中寻址某个汉字的点阵数据了。
在计算机中英文可以使用 ASCII 码来表示,而汉字使用的是扩展 ASCII 码,并且使用两个扩展ASCII码来表示一个汉字。
一个 ASCII 码使用一个字节表示,所谓扩展 ASCII 码,也就是ASCII码的最高位是1的ASCII码,简单的说就是码值大于等于 128 的 ASCII 码。一个汉字由两个扩展 ASCII 码组成,第一个扩展ASCII码用来存放区码,第二个扩展 ASCII 码用来存放位码。
在 GB2312-80 标准中,将所有的汉字分为94个区,每个区有94个位可以存放94个汉字,形成了人们常说的区位码,这样总共就有 94*94=8836 个汉字。在点阵字库中,汉字点阵数据就是按照这个区位的顺序来存放的,也就是最先存放的是第一个区的汉字点阵数据,在每一个区中有是按照位的顺序来存放的。
在汉字的内码中,汉字区位码的存放实在扩展 ASCII 基础上存放的,并且将区码和位码都加上了32,然后存放在两个扩展 ASCII 码中。
中文点阵字库的原理,当然还有英文点阵字库了。英文点阵字库中单个点阵字模数据的存放方式与中文是一模一样的,也就是对我们所写的_draw_model函数同样可以使用到英文字库中。唯一不同的是对点阵字库的寻址上。英文使用的就是 ASCII码,其码值是0到127,
区分中英文的关键就是,一个字符是ASCII码还是扩展 ASCII码,如果是 ASCII 码,其范围是0到127,这样是使用的英文字库,如果是扩展 ASCII码,则与其后的另一个扩展 ASCII 码组成汉字内码,使用中文字库进行显示。只要正确区分 ASCII 码的类型并进行分别的处理,也就能实现中英文字符串的混合输出了
现在是83年,后世很多的计算机语言都还没有开发出来,只能够用C语言进行操作。
蔡国在做系统架构的时候突然发觉,这个时候的机器内存只有256K,天啦,该怎么办,这样的内存,啥事儿都做不了。