单片机上常用GB2312、GBK汉字取模与字库

【摘要】 使用单片机开发程序时,经常需要使用lcd显示屏显示一些文字、数字。单片机因为配置不高,很多场合也不需要显示很多文字或者说只是显示一种大小、或者固定几种大小的文字,或者显示一些固定的文字或者一些英文字母、数字。如果只是显示固定文字,这时可以直接将要显示的文字提前取模存放到程序中,在通过lcd屏画点函数将数据画在lcd屏幕上去。如果显示固定大小的文字,可以制作点阵字库。
一、 gb2312编码 gb2312 码是中华人民共和国国家汉字信息交换用编码,全称《信息交换用汉字编码字符集–基本集》, 由国家标准总局发布, 1981 年 5 月 1 日 实施,通行于大陆。新加坡等地也使用此编码。gb2312 收录简化汉字及符号、字母、 日文假名等共 7445 个图形字符,其中汉字占 6763 个。gb2312 规定,习惯上称第一个字节为, 第二个字节为。gb2312-80 包含了大部分常用的一、二级汉字, 和 9 区的符号。该字符集是几乎所有的中文系统和国际化的软件都支持的中文字符集,这也是最基本的中文字符集。其编码范围是高位 0xa1- 0xfe, 低位也是 0xa1-0xfe;汉字从 0xb0a1 开始,结束于 0xf7fe。gb2312 将代码表分为 94 个区,对应第一字节( 0xa1 -0xfe);每个区 94 个位(0xa1-0xfe),对应第二字节,两个字节的值分别为区号值和位号值加 32(20h), 因此也称为区位码。01-09 区为符号、数字区, 16-87 区为汉字区(0xb0-0xf7),10-15 区、88-94 区是有待进一步标准化的空白区。 gb2312 将收录的汉字分成两级: 第一级是常用汉字计 3755 个,置于 1 6-55 区, 按汉语拼音字母/笔形顺序排列;第二级汉字是次常用汉字计 3008 个,置于 56-87 区,按部首/笔画顺序排列。
故而 gb2312 最多能表示 6763 个汉字。
二、gbk编码 全国信息技术化技术委员会于 1995 年 12 月 1 日《汉字内码扩展规范》。gbk 向下与 gb2312 完全兼容,向上支持 iso 10646 国际标准,在前者向后者过渡过程中起到的承上启下的作用。gbk 亦采用双字节表示,总体编码范围为 8140-fefe 之间,首字节在 81-fe 之间,尾字节在 40-fe 之间,剔除 xx7f 一条线。
gbk 共收入 21886 个汉字和图形符号,包括:
gb2312 中的全部汉字、非汉字符号。
big5 中的全部汉字。
与 iso 10646 相应的国家标准 gb13000 中的其它 cjk 汉字,以上合计 20902 个汉字。
其它汉字、部首、符号,共计 984 个。
gbk 编码区分三部分:
汉字区,包括: gbk/2:oxboa1-f7fe, 收录 gb2312 汉字 6763 个,按原序排列;
gbk/3:ox8140-aofe,收录 cjk 汉字 6080 个;
gbk/4:oxaa40-feao,收录 cjk 汉字和增补的汉字 8160 个。
图形符号区,包括: gbk/1:oxa1a1-a9fe,除 gb2312 的符号外,还增补了其它符号
gbk/5:oxa840-a9ao,扩除非汉字区。
用户自定义区: 即 gbk 区域中的空白区,用户可以自己定义字符
每个 gbk 码由 2 个字节组成:
第一个字节为 0x81~0xfe
第二个字节分为两部分:
0x40~0x7e 2.0x80~0xfe。
其中与 gb2312 相同的区域,字完全相同。
我们把第一个字节代表的意义称为区,那么 gbk 里面总共有 126 个区( 0xfe-0x81+1),
每个区内有 190 个汉字( 0xfe-0x80+0x7e-0x40+2),总共就有 126190=23940 个汉字。我们的点阵库只要按照这个编码规则从 0x8140 开始,逐一建立, 每个区的点阵大小为每个汉字所用的字节数190。这样,我们就可以得到在这个字库里面定位汉字的方法:
当 gbkl0x80 时: hp=((gbkh-0x81)190+gbkl-0x41)(size*2);
其中 gbkh、 gbkl 分别代表 gbk 的第一个字节和第二个字节(也就是高位和低位), size
代表汉字字体的大小(比如 16 字体, 12 字体等), hp 则为对应汉字点阵数据在字库里面的起始地址(假设是从 0 开始存放)。
这样我们只要得到了汉字的 gbk 码,就可以显示这个汉字了。从而实现汉字在液晶上的显示。
简化公式:
if(l<0x7f)l=l-0x40;else l=l-0x41;h=h-0x81; addr=(190*h+l)*size; l 是汉字的低字节,h是汉字的高字节。
addr 是该汉字在字库里的偏移量。
size 是该汉字的应点阵集所占的字节数量。
汉字的高字节大于0x80 ,才是汉字。高字节小于0x80就是英文字符。
字库在flash寻址过程:
首先得到该汉字点阵码在flash里的存储偏移量,然后在加上该汉字库在flash里的存放起始地址,就得到了该汉字的点阵数据位置。
得到绝对位置之后,就可以读出点阵码,进行打点显示。
big5 编码
big5 是通行于台湾、香港地区的一个繁体字编码方案。虽然存在一些瑕疵,但广泛应用于电脑行业,尤其是互联网中,从而成为一种事实上的行业标准。
1983 年 10 月,台湾国家科学委员会、教育部国语推行委员会、中央标准局、行政院共同制定了《通用汉字标准交换码》,后经修订于 1992 年 5 月公布,更名为《中文标准交换码》,big5 是台湾资讯工业策进会根据以上标准制定的编码方案。
big5 码是双字节编码方案,其中第一个字节的值在 oxao-oxfe 之间,第二个字节在 ox40-ox7e 和
oxa1-oxfe 之间。
big5 收录 13461 个汉字和符号,包括:
符号 408 个,编码位置 a140-a3be 常用字 5401 个,编码位置 a440-c67e,包括台湾教育部颁布的《常用国字标准字体表》的全部汉字 4808 个,台湾教科书常用字 587 个,异体字 6 个。 次常用字 7652 个,编码位置 c940-f9d5,包括台湾教育部颁布的《次常用国字标准字体表》的全部汉字 6341 个,《罕用国字标准字体表》中使用频率较高的字 1311 个。 gb13000 编码
gb13000 等同于国际标准的《通用多八位编码字符集 (ucs)》 iso10646.1,就是等同于 unicode 的标准,代码页等等的都使用 utf 的一套标准。
从 ascii、gb2312、gbk 到 gb18030,这些编码方法是向下兼容的,即同一个字符在这些方案中总是有相同的编码,后面的标准支持更多的字符。在这些编码中,英文和中文可以统一地处理。区分中文编码的方
法是高字节的最高位不为 0。按照程序员的称呼,gb2312、gbk 到 gb18030 都属于双字节字符集 (dbcs)。
三、偏移量计算 gb2312收录简化汉字及符号、字母、日文假名等共7445 个图形字符,其中汉字占6763 个。gb2312 规定“对任意一个图形字符都采用两个字节表示,每个字节均采用七位编码表示”,习惯上称第一个字节为“高字节”,即所谓的区码。第二个字节为“低字节”,即所谓的位码。gb2312―80包含了大部分常用的一、二级汉字,和9区的符号。该字符集是几乎所有的中文系统和国际化的软件都支持的中文字符集,这也是最基本的中文字符集。其编码范围是高位0xa1~0xfe,低位也是0xa1~0xfe;汉字从0xb0a1开始,结束于0xf7fe。gb2312将代码表分为94个区,对应第一字节(0xa1~0xfe);每个区94 个位(0xa1~0xfe),对应第二字节。两个字节的值分别为区号值和位号值加32(20h),因此也称为区位码。01~09区为符号、数字区,16~87区为汉字区(0xb0~0xf7),10~15区、88~94区是有待进一步标准化的空白区。gb2312将收录的汉字分成两级:第一级是常用汉字计3755个,置于16~55区,按汉语拼音字母/笔形顺序排列:第二级汉字是次常用汉字计3008 个,置于56~87 区,按部首/笔画顺序排列。故而gb2312 最多能表示6763 个汉字。
而gbk内码完全兼容gb2312,同时支持繁体字,总汉字数有2万多个,编码格式如下,每个gbk 码由2 个字节组成,第一个字节为0x81~0xfe,第二个字节分为两部分,一是0x40~0x7e,二是0x80~0xfe。其中与gb2312相同的区域,字完全相同。把第一个字节代表的意义称为区,那么gbk里面总共有126个区(0xfe~0x81+1),每个区内有190 个汉字(0xfe~0x80+0x7e~0x40+2),总共就有126x190=23940 个汉字。点阵库只要按照这个编码规则从0x8140开始,逐一建立,每个区的点阵大小为每个汉字所用的字节数乘以190。这样,就可以得到在这个字库里面定位汉字的方法:
当gbkl0x80 时:hp=((gbkh-0x81)×190+gbkl-0x41)×(sizex2);
其中gbkh、gbkll 分别代表gbk 的第一个字节和第二个字节(也就是高位和低位),size 代表汉字字体的大小(比如16 字体,12 字体等),hp 则为对应汉字点阵数据在字库里面的起始地址。
对于gbk 字库和gb2312 字库,他们的解码部分部分略有不同,这个区别主要是由于他们的编码方式不同引起的,对于gbk 字库,解码的方式如下:
qh=*code;ql=*(++code);if(ql 五、封装文字描点函数void displaydata(u32 x,u32 y,u32 w,u32 h,u8 *p,u16 c1,u16 c2){ u16 i,j,x0=x; u8 data; u16 colortemp=point_color; for(i=0;i0x80) //判断是否是中文-编码规则从 0x8140 开始 { if(x+size>239) { x=0; //横坐归0 y+=size; //换行 if(y+size>319)return; } //lcd_showchar2(x,y,size,*p,c1,c2);//显示一个中文 x+=size; p+=2; //偏移两个字节 } else if(*p>=' ' && *p239) { x=0; //横坐归0 y+=size; //换行 if(y+size>319)return; } if(size==16) { //显示英文字母 displaydata(x,y,size/2,size,(u8*)ascii_8_16[*p-' '],c1,c2); } else if(size==24) { displaydata(x,y,size/2,size,(u8*)ascii_8_16[*p-' '],c1,c2); } p+=1; x+=size/2; } else if(*p=='\n') { x=0; y+=size; p+=1; //偏移指针 } else { p+=1; //偏移指针 } }}
小米6不再有阉割版,满血版高通骁龙835,还满意吗
汽车操作系统研究:整车操作系统的三种实现方式
什么是PFMEA中有效的原因分析呢?
iQOO手机采用44W超快闪充只需45分钟即可充满电在续航方面也堪称惊人
挺进3G芯片 展讯追赶联发科
单片机上常用GB2312、GBK汉字取模与字库
双积分政策的实施有效的推动了新能源汽车的转型升级
7类网线与超6类网线的区别
存储器系统的非对齐访问
5G建设加快意味着什么
气体质量流量传感器FS4003:应用于乙炔流量检测
国家超级计算郑州中心通过验收:峰值算力达100Pflops
塑封贴片压敏电阻厂家哪家好?需要考虑哪些方面?
新的RDM系列硅光电倍增管 (SiPM) 阵列
中兴Axon 40系列新品即将首发,配备独立安全芯片
优傲机器人系统改造,带来更大应用价值
stm32入门开发板选野火还是正点原子呢?
电流检测电阻器基本概念:如何使用万用表测量电流
国芯科技:自研车用MCU新品内测成功,适用于动力总成等领域
试验变压器与电力变压器的区别