一、概述
本文为大家讲解GBK编码全字库的生成和使用实现,相比GB2312编码,支持的字符更加完善,不过生成的全字库文件要大,如果项目中GB2312编码字符无法满足要求时,可以采用这种方式。
根据本文的知识,大家就可以生成项目所需的点阵大小,不过仅支持等宽字体,非等宽字体显示效果不够好。另外,这里说成任意大小是方便大家理解,生成点阵的大小是受限于用户所使用字体生成软件是否支持生成任意大小点阵字体,如果支持的话且芯片资源够用,那么使用本章节提供的方法是没有问题的。
二、初学者提示
1、GBK向下完全兼容GB2312,但比GB2312支持的字符更加完善,不过生成的全字库文件要大,如果项目中GB2312编码字符无法满足要求时,可以采用GBK编码字库。
2、对于XBF格式和SIF格式的Unicode编码全字库的用户来说,使用GBK编码是很好的选择,很适合初学者,汉字操作方式与大家裸机代码(没有使用GUI)时是一样的。
3、GBK编码的全字库文件可以存到任何外部存储介质中。本文配套例子是将其存到SPI Flash里面了。
4、使用GBK编码也是有缺点的,相比前面章节使用FontCvt生成的XBF格式和SIF格式全字库,GBK编码全字库不支持抗锯齿效果,且仅支持等宽字体(仅支持等宽是因为当前新字体的创建方法不支持非等宽字体)。
三、GBK编码全字库的生成方法
第1步:下载多国语言点阵字库生成器,下载链接:点阵字库生成器 V3.8
第2步:打开此软件,打开后的效果如下:
默认已经是宋体,如果要选择其它字体可以点击左上角的“选择字体”,弹出下界面:
特别注意,这个软件在上面的界面里设置字体大小,没有任何效果,应该是软件的bug,不过不影响使用,因为有别的地方可以设置。
第3步:生成612点阵,816点阵,1224点阵和1632点阵的ASCII字符。
这里以宋体,816点阵为例进行说明。由于这个软件不支持生成ASCII字符,生成ISO 8859-1字符也是可以的。
(注意,左上角的字体大小设置和下面宽和高的点阵大小设置是有区别的,这里字体大小12对应的实际点阵大小是816,这两个选项都是要用户进行设置的)
点击创建后:
点击选项创建字库,弹出如下窗口:
点击保存后,此软件会有一个生成进度:
生成完毕后,就可以在桌面上看到生成的文件ascii16.dzk。同样的方法再生成12点阵,24点阵和32点阵的ASCII字符,12点阵的配置如下:
生成的字库文件命名为ascii12.dzk,24点阵的配置如下:
生成的字库文件命名为ascii24.dzk,32点阵的配置如下:
生成的字库文件命名为ascii32.dzk,这样12点阵,16点阵,24点阵和32点阵的ASCII字符就都生成了:
第4步:生成1212点阵,1616点阵,2424点阵和3232点阵的GBK编码字符。
这里以宋体,1616点阵为例进行说明。点阵字库生成器的配置如下:
(注意,那个等宽等高的对勾选上或者不选上均可,选上的话,其中一个设置了,另一个也跟着相同的变化,如果不选上,两个可以分别进行设置。另外,左上角的字体大小设置和下面宽和高的点阵大小设置是有区别的,这里字体大小12对应的实际点阵大小是1616,这两个选项都是要用户进行设置的)
点击保存后,此软件会有一个生成进度,由于字符较多,此过程比较慢,需要耐心等待。
生成完毕后,就在桌面上看到生成的文件hanzi16.dzk。同样的方法再生成12点阵,24点阵和32点阵的GBK字符,12点阵的配置如下:
生成的字库文件命名为hanzi12.dzk,24点阵的配置如下:
生成的字库文件命名为hanzi24.dzk,32点阵的配置如下:
生成的字库文件命名为hanzi32.dzk,这样12点阵,16点阵,24点阵和32点阵的GBK字符就都生成了:
第5步:合并生成的8个文件
打开文件合并助手(下载地址:文件合并助手),将这8个文件全部加载进来。
添加字库后,效果如下:
输出窗口已经自动生成了对应字体的首地址。这个地址要保存好,后面要用到。
第6步:点击右下角的合并,会弹出一个窗口。
点击保存后,桌面后生成一个font.bin的文件:
font.bin文件下载链接
注意,合并后的这个文件不要超过16MB,因为文配套板子的SPI Flash大小是16MB。这个文件的实际大小大约是5.87MB,没有超过16MB。
四、GBK编码全字库的地址计算
GBK编码也需要两个字节来表示,第一个字节是区号,范围是81到FE,第二个字节是位号,位号是该字在该区中的位置,范围是40到7E和80到FE,其中7F部分是没有编码的,这点要特别注意。下面是GBK的编码范围表。
从上面表格可以看出,GBK区间是8140~FEFE,其中XX7F部分是要删除的, GBK 里有FE-81+1=126个区,每个区有FE-40-1+1=190个字符,因此一共有126*190=23940个字符,与上面的表格编码数是一致的。
1、汉字点阵GB2312编码字库地址计算
所有点阵字体的计算公式是一样的,仅首地址和每个点阵字符需要的字节数不一样,这里配置的首地
址是前面27.2小节通过文件合并助手获取的。
GBCod:表示汉字内码。
MSB:表示汉字内码GBCode的高8bits,
LSB:表示汉字内码GBCode的低8bits。
Address 表示汉字或ASCII字符点阵在芯片中的字节地址。
BaseAdd:说明点阵数据在字库中的起始地址。
BytesPerFont:一个字符需要的字节数
12*12点阵字体的首地址:
BaseAdd=0x00008C00;
BytesPerFont = 24字节
16*16点阵字体的首地址:
BaseAdd=0x00095060;
BytesPerFont = 32字节
24*24点阵字体的首地址:
BaseAdd=0x001500E0;
BytesPerFont = 72字节
3232点阵字体的首地址:
BaseAdd=0x002F4E00;
BytesPerFont = 148字节
这四种点阵全部是采用下面的计算公式:
Address = ((MSB - 0x81) * 190 + (LSB - 0x40)- (LSB / 128)) BytesPerFont + BaseAdd;
2、ASCII字符地址计算
所有点阵字体的计算公式是一样的,仅首地址和每个点阵字符需要的字节数不一样。这里配置的首地
址是前面27.2小节通过文件合并助手获取的。
ASCIICode:表示ASCII 码( 8bits)
BaseAdd:说明该套字库在芯片中的起始地址。
Address: ASCII字符点阵在芯片中的字节地址。
BytesPerFont&#