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

[复制链接]

版主

发表于 2017-3-19 20:12:45   816 查看 1 回复 显示全部楼层 倒序浏览
分享
例说FPGA连载81TXT文本阅读器设计之GB2312中文字符集简介
特权同学,版权所有
配套例程和更多资料下载链接:
http://pan.baidu.com/s/1c0nf6Qc
1.jpg
概述
GB2312是一个简体中文字符集的中国国家标准,全称为《信息交换用汉字编码字符集-- 基本集》,由中国国家标准总局发布,1981年5月1日实施。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个像素点对应的色彩数据来表示这个字符。当然,每个像素点的色彩可以用24bit(RGB888)表示,也可以用16bit(RGB565)表示。但是,从最经济实用的角度来看,我们还是愿意用最小的数据量去表示最重要的特征信息。因此,通常的字模只会花1bit来表示1个像素点。1bit的数据可以是0,也可以是1,我们可以假设代表某个像素点的1bit为1时,显示图示的白色;为0时,显示图示的黑色。当然了,我们不会这么“土得掉牙”的让这些字符在我们的液晶屏上只显示黑白了,我们可以换任何我们期望的颜色,这是后话,设计中我们可以变通。那么,对于64*32分辨率的字符“A”,我们需要64*32bit,即256Byte数据就可以表示出来。
2.jpg
图16.3 基于像素点的字符显示
         我们这个实例中涉及到的GB3212中文字符分别有3种分辨率大小,即16*16、32*32和64*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、低字节为LSB的GB2312码,它在我们的字库中的寻址换算为:(((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{|}~”,我们就将它们的字模分别存放到GB2312的0xA4分区中。
3.jpg
图16.4 0xA4分区字符截图
         因此,在遇到ASCII码时,它对应在GB2312字库区的寻址就是:ASCII码值 - 0x20 + 0x5E*3 =ASCII码值 - 0xFA 。

工程师

发表于 2017-3-22 09:51:01  
谢谢分享,学习学习。。。
回复

点赞

高级模式
您需要登录后才可以回帖 登录 | 注册

专家问答 查看更多>>
关闭

站长推荐 上一条 /9 下一条

小黑屋|手机版|Archiver| 电子发烧友 ( 粤ICP备14022951号-2 )     

GMT+8, 2017-7-21 10:31 , Processed in 0.098893 second(s), 14 queries , Memcache On.

微信扫描
快速回复 返回顶部 返回列表
-

推荐专区

技术干货集中营

专家问答

用户帮助┃咨询与建议┃版主议事

我的提问

工程师杂谈

工程师创意

工程师职场

论坛电子赛事

社区活动专版

发烧友活动

-

嵌入式论坛

单片机/MCU论坛

FPGA|CPLD|ASIC论坛

DSP论坛

嵌入式系统论坛

-

电源技术论坛

电源技术论坛

-

硬件设计论坛

PCB设计论坛

电路设计论坛

电子元器件论坛

控制|传感

总线技术|接口技术

-

测试测量论坛

LabVIEW论坛

Matlab论坛

测试测量技术专区

仪器仪表技术专区

-

EDA设计论坛

multisim论坛

PADS技术论坛

Protel|AD|DXP论坛

Allegro论坛

proteus论坛|仿真论坛

EasyEDA-中国人自已的EDA工具

Orcad论坛

-

综合技术与应用

电机控制

智能电网

光电及显示

参考设计中心

汽车电子技术论坛

医疗电子论坛

-

开源硬件

DFRobot专区

树莓派论坛

智能硬件论坛

开发快智能硬件开发平台

Intel物联网开发者专区

Waveshare

乐美客SBC专区

Arduino论坛

BeagleBone论坛

机器人论坛

创客神器NanoPi

小钢炮CANNON

比派科技banana pi专区

-

无线通信论坛

无线通信技术专区

天线|RF射频|微波|雷达技术

-

IC设计论坛

芯片测试与失效分析

Mixed Signal/SOC[数模混合芯片设计]

Analog/RF IC设计

设计与制造封装测试

-

个人版区

阿东Verilog技术专版

直流马达驱动电路设计

LabVIEW英雄联盟

特权同学FPGA专区

-

厂商专区

灵动微电子 MM32

盈鹏飞嵌入式

TI论坛

TI Deyisupport社区

芯灵思嵌入式论坛

Tisan

米尔科技

庆科社区

WIZnet技术专区

Cypress技术论坛

飞凌嵌入式

Qualcomm技术论坛

英创嵌入式

机智云GoKit论坛

-

检测技术与质量

电磁兼容(EMC)设计与整改

安规知识论坛

检测与认证

-

消费电子论坛

手机技术论坛

平板电脑/mid论坛

音视/视频/机顶盒论坛

-

电子论坛综合区

聚丰众筹官方社区

新人报道区

聚丰供应链

-

论坛服务区

-

供求信息发布

供需广告

招聘┃求职发布区

电子展览展会专区