`

在汉字库中寻找某个汉字的点阵数据

    博客分类:
  • Java
FP 
阅读更多

在计算机中英文可以使用 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点阵汉字库

    2. 汉字编码查找:根据需要显示的汉字编码在字库中定位到对应的点阵数据。 3. 点阵数据解析:将点阵数据解码为二维像素数组。 4. 显示汉字:将像素数组渲染到屏幕上。 总结,16*16和32*32点阵汉字库是用于显示汉字...

    汉字点阵字库及读取程序

    在给定的"汉字点阵字库及读取程序"中,主要包含两个关键部分:16X16的标准点阵汉字库和用于读取该字库的C语言程序。 1. **16X16标准点阵汉字库**:这是汉字的一种表示方式,每个汉字由16行16列的二进制点阵组成。每...

    点阵汉字库生成

    5. **驱动程序开发**:在嵌入式系统中,还需要编写驱动程序来解析汉字库,将汉字点阵数据转化为能在LCD上显示的指令。 提到的"PCtoLCD2002"工具,它是一个常用的点阵汉字库制作软件,可以帮助用户方便地完成上述...

    16点阵小汉字库生成工具

    点阵汉字库是一种将汉字图形化表示的技术,广泛应用于早期的计算机系统和现在的工控设备中,尤其是在低分辨率的显示屏上。"16点阵小汉字库生成工具"是一款专为工控系统设计的软件,它允许用户在Windows环境下方便地...

    点阵16*16汉字库

    "汉字点阵字库的原理与显示.mht"文件很可能是对这个概念的详细解释,包括如何构建和解析点阵数据,以及如何在屏幕上正确地显示这些字库中的汉字。MHT文件是一种单一文件网页,包含了HTML内容和相关的资源,阅读此...

    齐全的汉字点阵码字库文件包

    汉字点阵码字库是计算机显示汉字的重要方式之一,尤其在嵌入式系统、单片机和LCD(液晶显示屏)应用中,它扮演着至关重要的角色。本压缩包文件包全面覆盖了GB2312标准,这是一种常用的中文字符集,包含了6763个常用...

    点阵式汉字库

    首先,"16*16格式"指的是每个汉字在点阵库中的表示方式。点阵汉字是通过16行16列的二进制点阵来构造的,每个点代表一个像素,0表示黑色(非点亮),1表示白色(点亮)。这样的设计使得汉字可以以清晰的黑白二值图像...

    unicode编码汉字库(16*16点阵)

    Unicode编码下的16*16点阵汉字库(先左后右先上后下),宋体12号或小4字体大小(简体)。取码范围0X4E00-0X9FFF

    汉字点阵数据生成工具

    汉字点阵数据生成工具是一种专门用于创建汉字在液晶LCD(Liquid Crystal Display)显示设备上的点阵数据的软件。在LCD显示屏上,每个汉字都是由一系列像素点构成的矩阵,这种矩阵就称为点阵。点阵数据是将汉字形状...

    GB2312编码汉字库(16*16点阵)

    GB2312编码下的16*16点阵汉字库(先左后右先上后下),宋体12号或小4字体大小(简体)

    C语言点阵汉字16x16

    在16x16点阵库中,区位码可以转换为汉字的内存地址,从而快速定位到汉字的点阵数据。 3. **点阵字模生成**:点阵字模通常是通过特定的软件工具生成的,如“汉字点阵字模生成器”。这些工具可以根据选定的字体风格,...

    汉字字模点阵数据批量生成工具

    在实际应用中,这些点阵数据可以被嵌入到嵌入式系统的固件中,比如在微控制器驱动的LCD显示屏上显示汉字。在资源有限的环境下,点阵字库因为其紧凑的存储方式和较低的计算需求,成为了首选的汉字显示解决方案。 在...

    16乘16矩阵的点阵汉字库

    在实际应用中,为了方便使用,点阵汉字库通常会有一个查找表或者索引,根据输入的汉字Unicode码或者区位码找到对应的点阵数据。此外,还需要相应的库函数来解析和绘制这些点阵数据。开发者在编程时,需要将输入的...

    汉字库12X12汉字库

    汉字点阵库 12X12 的点阵汉字库,需要的可以下来看看,干嘛要20个汉字的说明啊 ,晕死

    16X16汉字点阵字库

    在显示汉字时,程序会根据需要的字符的区位码在字库中查找对应的点阵数据,并在LCD上逐点绘制。 4. **内存优化**: 由于嵌入式系统的内存资源有限,16x16点阵字库相对于更大尺寸的点阵(如32x32或更高)来说,内存...

    单片机中使用汉字库的例子

    - 查找汉字:根据编码在汉字库中找到对应的点阵数据。 - 显示汉字:将点阵数据转化为屏幕上的像素,通过液晶屏或LED矩阵进行显示。 3. 在单片机中的实现: - 存储管理:汉字库文件通常以二进制格式存储在单片机...

Global site tag (gtag.js) - Google Analytics