特权同学

例说FPGA连载81:TXT文本阅读器设计之GB2312中文字符集简介

0
阅读(1586)

例说FPGA连载81TXT文本阅读器设计之GB2312中文字符集简介

特权同学,版权所有

配套例程和更多资料下载链接:

http://pan.baidu.com/s/1c0nf6Qc

1.jpg

概述

GB2312是一个简体中文字符集的中国国家标准,全称为《信息交换用汉字编码字符集--基本集》,由中国国家标准总局发布,198151日实施。GB2312编码通行于大陆,新加坡等地也采用此编码。几乎所有的中文系统和国际化的软件都支持GB2312

GB2312标准共收录6763个汉字,其中一级汉字3755个,二级汉字3008个;同时,GB2312收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄罗斯语西里尔字母在内的682个全形字符。GB2312的出现,基本满足了汉字的计算机处理需要,它所收录的汉字已经覆盖99.75%的使用频率。

分区表示

GB2312中对所收汉字进行了“分区”处理,每区含有94个汉字或符号。这种表示方式也称为区位码

01-09区为特殊符号。

16-55区为一级汉字,按拼音排序。

56-87区为二级汉字,按部首/笔画排序。

10-15区及88-94区则未有编码。

举例来说,“啊”字是GB2312之中的第一个汉字,它的区位码就是1601

字节结构

在使用GB2312的程序中,通常采用EUC储存方法,以便兼容于ASCII。每个汉字及符号以两个字节来表示。第一个字节称为“高位字节”(或称MSB),第二个字节称为“低位字节”(或称LSB)。

“高位字节”使用了0xA1-0xF7(把01-87区的区号加上0xA0)区间的数据进行编码,“低位字节”使用了0xA1-0xFE(把01-94加上0xA0)区间的数据进行编码。

例如“啊”字在大多数程序中,会以0xB0A1储存。(由区位码计算为:0xB0=0xA0+16,0xA1=0xA0+1)。

结合前面的分区,我们可以将GB3212的编码规则归纳如下。

每个汉字或符号用2个字节表示,高字节代表其所在分区,低字节代表具体的编码值。

编码高字节,即分区字节的取值范围是0xA1-0xF7,共94个可用的分区。

编码低字节,即具体的编码值取值范围是0xA1-0xFE,共94个可用编码值。

对于分区字节,又分为以下几个部分。

0xA1-0xA9区为特殊符号。

0xB0-0xD7区为一级汉字,按拼音排序。

0xD8-0xF7区为二级汉字,按部首/笔画排序。

0xAA-0xAF区及0xF8-0xFE区则未有编码。

字模显示原理

如图16.3所示,这是某字符取模软件的截图。它大体示意出了字模显示的基本原理。通常,我们若希望在液晶屏上显示出一个字符,比如这个字符是分辨率为64*32的“A”,那么在这个显示区域内,我们就必须有64*32个像素点对应的色彩数据来表示这个字符。当然,每个像素点的色彩可以用24bitRGB888)表示,也可以用16bitRGB565)表示。但是,从最经济实用的角度来看,我们还是愿意用最小的数据量去表示最重要的特征信息。因此,通常的字模只会花1bit来表示1个像素点。1bit的数据可以是0,也可以是1,我们可以假设代表某个像素点的1bit1时,显示图示的白色;为0时,显示图示的黑色。当然了,我们不会这么“土得掉牙”的让这些字符在我们的液晶屏上只显示黑白了,我们可以换任何我们期望的颜色,这是后话,设计中我们可以变通。那么,对于64*32分辨率的字符“A”,我们需要64*32bit,即256Byte数据就可以表示出来。

2.jpg

16.3基于像素点的字符显示

我们这个实例中涉及到的GB3212中文字符分别有3种分辨率大小,即16*1632*3264*64,它们所需要的Flash存储空间计算如表16.1所示。

16.1不同分辨率字体所需字模数据量

字体分辨率大小

单个字符数据量

字库总数据量

16*16

16*16bit = 32Byte

32*94*94Byte = 282752B

32*32

32*32bit = 128Byte

128*94*94Byte = 1131008B

64*64

64*64bit = 512Byte

512*94*94Byte = 4524032B

实际字库存储结构

标准的GB2312码,出于“节能减排”的需要,我们不管它们的编码如何,字模数据一定是按顺序依次排列。因此,对于给定的高字节为MSB、低字节为LSBGB2312码,它在我们的字库中的寻址换算为:(((MSB - 0xa1) * 0x5e) + (LSB - 0xa1))

由于GB2312中并没有定义ASCII码,而我们实际的工程使用中通常会非常频繁的使用ASCII码。ASCII码只有1个字节表示,取值为0x00-0x7F。因此,我们在原有的GB2312标准字库字模中人为的插入一些我们ASCII码对应的字库。

如图16.4所示,在GB2312定义的0xA4分区中,这些符号恐怕我们这辈子都用不上,那么我们就考虑直接将ASCII码的字模存放在这个区域。从0x21~0x7f对应的ASCII码为“!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~”,我们就将它们的字模分别存放到GB23120xA4分区中。

3.jpg

16.4 0xA4分区字符截图

因此,在遇到ASCII码时,它对应在GB2312字库区的寻址就是:ASCII码值- 0x20 + 0x5E*3 = ASCII码值- 0xFA


Baidu
map