因最近工作需要,故了解了一下中文点阵字库的用法,整理了下学习资料,特此分享、自勉

本文参考了:
HZK16汉字16*16点阵字库的使用及示例程序  
https://blog.twofei.com/embedded/hzk.html

点阵字库HZK12 HZK16 HZK24 ASC12 ASC16 简介 及 使用方法[附源码]  
http://blog.sina.com.cn/s/blog_8c7bf19701010rhn.html

GB2312简体中文编码表
http://www.knowsky.com/resource/gb2312tbl.htm
在这特此感谢~


GBK,GB2312和Big5简介
汉字编码,在PC中,现在主要用到的有三类,包括GBK,GB2312和Big5。
1. GB2312, 它是一个简化字的编码规范,当然也包括其他的符号、字母、日文假名等,共7445个图形字符,其中汉字占6763个
2. GBK是GB2312的扩展,是向上兼容的,因此GB2312中的汉字的编码与GBK中汉字的相同。另外,GBK中还包含繁体字的编码, GBK中有码位23940个,包含汉字21003个
3. Big5又称大五码,主要为香港与台湾使用,即是一个繁体字编码。每个汉字由两个字节构成。

简单粗暴点:
GB2312,简体中文、数字、字母;
Big5 繁体字;
GBK, 是GB2312的扩展版,简体中文、数字、字母,还外加繁体字

注:
从《GB2312简体中文编码表》可以看到,从第一个区块0xA0开始,一共有94个区块,而每个区块有94个字符,其中汉字区块从0xB0开始


点阵字库简介
点阵字库,就是将制作好的字母,汉字-字模放到了一个个标准的库里,后续要用时,类似一本字典,通过GB2312码,查出对应的字模,方便使用。
点阵字库,主要有这些:
1.ASC码表字库
(1)ASC16,8*16,每个字符占16个字节
(2)ASC24,16*24,每个字符占48个字节

2.GB2312码表字库
(1)HZK12, 16*12, 每个字符占24个字节,(每横排占12个二进制位,后4位为0,是为了补齐凑8的整数倍,便于计算吧)
(2)HZK16, 16*16, 每个字符占32个字节
(3)HZK24, 24*24,每个字符占72个字节
(4)HZK32,32*32,每个字符占128个字节
(5)HZK40, 40*40, 每个字符占200个字节
(6)HZK48, 48*48, 每个字符占288个字节
网上可能有类似HZK24F、HZK24H、HZK24K、HZK24S的字库,
这些字库,结构上都是于HZK24相同的,只是字体类型上不同而已,

即F表示仿宋体、H表示黑体、K表示楷体、S表示宋体



点阵字库用法示例


以HZK16点阵字库


HZK16字库是符合GB2312标准的16×16点阵字库,HZK16的GB2312-80支持的汉字有6763个,符号682个. 其中一级汉字有 3755个,按声序排列,二级汉字有3008个,按偏旁部首排列.


我们在一些应用场合根本用不到这么多汉字字模, 所以在应用时就可以只提取部分字体作为己用.


HZK16字库里的16×16汉字一共需要256个点来显示,也就是说需要32个字节才能达到显示一个普通汉字的目的.


(这里讲解下,为什么是32个字节)


16×16表示,一个汉字占256个二进制位点,来显示,即横排16个二进制位,竖排16个二进制位


横排8个二进制位为一个字节,即横排2个字节,竖排一个汉字则有16排(16个二进制点位),故就是2×16=32字节


java点阵字库 点阵字库文件_点阵字库




以汉字“啊”为例, 在PC中,会转换成对应的汉字机内码,即为GB2312码,


其GB2312码,为两个字节,分别是176、161(0xB0、0xA1)


这两个字节的意义是,前一个字节为该汉字的区号,后一个字节为该字的位号



我们可以通过这2个字节,去查出,在HZK16点阵字库中,对应的汉字“啊”的点阵字模。(HZK16就是一本基于GB2312的字典)


通过GB2312编码表中,可知一共有94个区块,每个区块又有94个字符,对应的汉字区块从0xBO开始。


(特别注意:几乎所有点阵字库存放位置,都是A1区块的94个字符然后紧接着A2区块的94个字符,两区块存放时,中间是没有空格的)

java点阵字库 点阵字库文件_java点阵字库_02



计算汉字“啊”在HZK16中的绝对偏移位置:


偏移区块数:汉字前一个字节-0xA1(因为汉字区块是从0xA1区开始的, 所以文件最前面就是从0xA1区开始, 要算出相对区码)


偏移位码数:汉字的第二个字节-0xA1(因为每个汉字区块,都是从0xA1开始的)


offset=(94*偏移区块数 + 偏移位码数)*32


注:


1.(94*偏移区块数 + 偏移位码数)是汉字“啊”之前,有多少个字模需要偏移


2.乘以32 是因为HZK16中的每个字模,占32个字节




“啊”字的16*16点阵示意图(因0、1表示,根本看不清“啊”字了,故用○、●符号代替)


|<---16位,2字节-->|


○○○○○○○○○○○○○●○○     ->    00000000,00000100  ->0x00,0x04


○○●○●●●●○●●●●●●○     ->    00101111,01111110    ->0x2F,0x7E


●●●●●○○●○○○○○●○○     ->    11111001,00000100   ->0xF9,0x04


●○●○●○○●○○○○○●○○     ->    10101001,00000100  ->0xA9,0x04


●○●○●○●○○○○●○●○○     ->    10101010,00010100  ->0xAA,0x14


●○●○●○●○○●●●●●○○     ->    10101010,01111100   ->0xAA,0x7C


●○●○●●○○○●○●○●○○     ->    10101100,01010100  ->0xAC,0x54


●○●○●○●○○●○●○●○○     ->    10101010,01010100  ->0xAA,0x54


●○●○●○●○○●○●○●○○     ->    10101010,01010100  ->0xAA,0x54


●○●○●○○●○●○●○●○○     ->    10101001,01010100  ->0xA9,0x54


●●●○●○○●○●●●○●○○     ->    11101001,01110100   ->0xE9,0x74


●○●○●●○●○●○●○●○○     ->    10101101,01010100  ->0xAD,0x54


○○○○●○●○○○○○○●○○     ->    00001010,00000100  ->0x0A,0x04


○○○○●○○○○○○○○●○○     ->    00001000,00000100  ->0x08,0x04


○○○○●○○○○○○●○●○○     ->    00001000,00010100  ->0x08,0x14


○○○○●○○○○○○○●●○○     ->    00001000,00001100  ->0x08,0x0C



所以,“啊”字在HZK16 16*16点阵字库的存放的序列为:


一行一行地保存,共16行,每行2个字节, 共32个字节


0x00,0x04,0x2F,0x7E,0xF9,0x04,0xA9,0x04,0xAA,0x14,0xAA,0x7C,0xAC,0x54,0xAA,0x54,


0xAA,0x54,0xA9,0x54,0xE9,0x74,0xAD,0x54,0x0A,0x04,0x08,0x04,0x08,0x14,0x08,0x0C

程序运行截图:

java点阵字库 点阵字库文件_java点阵字库_03


示例源码:


#include "stdafx.h"
#include "stdlib.h"
#include "string.h"

int _tmain(int argc, _TCHAR* argv[])
{
	FILE *fd = NULL;
	unsigned char incode[3]="啊";
	unsigned char qh,wh;
	unsigned long offset = 0;

	int i, j, k = 0;

	char mat[16][2];
	memset(mat, 0x00, sizeof(32));
	
	qh = incode[0] - 0xa1;
	wh = incode[1] - 0xa1;
	offset = (94*qh + wh)*32;/*得到HZK16文件中,"啊"的绝对偏移位置,单个字模占32个字节*/
	
	if((fd = fopen("HZK16", "rb") )== NULL)
	{
		printf("can't opent HZK16\n");
		exit(0);
	}

	fseek(fd, offset, SEEK_SET);
	fread(mat, 32, 1, fd);

	for(j=0;j<16;j++)
	{
		for(i=0;i<2;i++)
		{
			for(k=0;k<8;k++)
			{
				if(mat[j][i]&(0x80>>k))
				{
					printf("●");
				}
				else
				{
					printf("○");
				}
				
			}
		}
		printf("\n");		
	}
	fclose(fd);

	system("pause");
	return 0;
}


对应字库,库文件下载地址:

里面包含:点阵字库 ASC16 ASC24 HZK16 HZK24 HZK32 HZK40 HZK48库文件,用法demo-C语言源码,运行截图及说明