gb2312,GBK,GB18030 国标码查询
参考:
https://blog.csdn.net/wvqusrtg/article/details/110234149
https://www.qqxiuzi.cn/zh/hanzi-gb18030-bianma.php
http://tools.jb51.net/table/gb2312
、
一、发布时间和汉字数量
GB 2312 于1980年发布,最少,只有6763 个汉字;
GBK于1995年发布,是21886 个汉字;
GB18030最多,分别是27533和70244,2000年和2005年的版本;
二、首先说下gb2312,这个是其他两个的基础,最早发布的就是gb2312;
gb2312编码是用一个类似二维数组一样的表格表示(参考:
http://tools.jb51.net/table/gb2312),
是用区位码表示,分为94个区(01-94),每区94个字符(01-94,汉字第0位和第95位为空),计算机中是用"EUC-CN"表示法,即在每个区位加上0xA0来表示
即第01区是0xA0+0x01 = 0xA1;第1位是0x01+0xA1 = 0xA1;
比如汉字“啊”在区位码是0xB0A1(区位码查询),就表示在0xB0-0xA0 = 0x10区(16区),0xA1-0xA0 = 0x01位;
用生成字库工具做好的字库bin文件,那是按不同字体字模存放的,如“啊”字存放在如下偏移位置:
offset_addr = (0xB0-0xA1)*94+(0xA1-0xA1) ;//减去0xA1而不是0xA0是因为要计算当前在的区位位置前面偏移了多少个区位,减0xA0是为了算当前在哪个区位,。
然后用flash读接口去读改地址就可以得到对应字模数据了;
如读取16x16字模:
offset = (hz_high - 0xA1) * 94 + (hz_low - 0xA1); //计算汉字所在的区位码偏移
font_add = FONTLIB_Font16_HEAD_ADD;//16x16字模首地址
font_add += offset * 32;//首地址+偏移*每个字模字节数
ExFLASH_Read(font_add, 32, font_buf);//读32个字节该字的字模数据;
三、GBK
GBK 采用双字节表示,总体编码范围为 8140-FEFE 之间,首字节在 81-FE 之间,尾字节在 40-FE 之间,剔除 XX7F 一条线。GBK 编码区分三部分:
- 汉字区 包括
GBK/2:0XB0A1-F7FE, 收录 GB 2312 汉字 6763 个,按原序排列;//同GB2312取模即可
GBK/3:0X8140-A0FE,收录 CJK 汉字 6080 个;
GBK/4:0XAA40-FEA0,收录 CJK 汉字和增补的汉字 8160 个。
https://www.qqxiuzi.cn/zh/hanzi-gbk-bianma.php
如读取16x16字模:
offset = (hz_high - 0x81) * 192 + (hz_low - 0x40); //计算汉字所在的区位码偏移
font_add = FONTLIB_Font16_HEAD_ADD;//16x16字模首地址
font_add += offset * 32;//首地址+偏移*每个字模字节数
ExFLASH_Read(font_add, 32, font_buf);//读32个字节该字的字模数据;
四、GB18030
GB18030 不同于gb2312和GBK的2字节,而是1\2\4字节结构;
兼容GB2312,GBK,即
GB18030-2000汉字
GB18030-2005汉字