原创 GB2312/GBK编码规则及单片机汉显字库算法(转)

2011-5-4 11:02 8574 7 7 分类: 工程师职场

最近整理旧物时,翻到了5年前的毕业设计,翻翻觉得还有些用,写个博客吧。

在一般的单片机汉显系统中,都会用到GB2312字库,也有少数的需要GBK字库。

“机内码”:英文字符在PC机中以单字节表示,汉子以最高位为1的双字节表示,可以用以下C程序来验证机内码(TC中执行):

main()

{ unsigned char * s,*e="ABcd",*c="你好";

 clrscr();

 printf("English char=");

s=e;

while(*s!=0)

{

printf("%3d,",*s); s++;

}

 printf("\nChinese char=");

s=c;

 while(*s!=0)

{

printf("%3d,",*s);

 s++;

}

getch();

} 

GB2312码是国家标准汉子信息交换用编码,根据机内码将汉子分为94个区,对应第一字节的低7位,每个区94个位,对应第二字节的低7位,并且在机内码的基础上减去0x20,即每个汉子的机内码两个字节分别减去0xa0即得到区位码,见下表。

GBK编码向下与GB2312编码兼容,向上支持ISO10646.1国际标准

汉子点阵字库:现在用得最多的点阵字库为16*16(对应Asc为16*8)、32*32(对应Asc为32*16),取点的方式有多种,大致有:

顺序行列式

逆序行列式

顺序列行式

逆序列行式

顺序逐行式

逆序逐行式

顺序逐列式

逆序逐列式
比较常用的是顺序行列式(UCDOS中采用的模式)

字摸入口计算公式:

GB2312:

CharPos := (高8bit - 0xA1)*94 + (低8bit - 0xA1)) :* 32
GBK:
CharPos := ((高8bit - 0x81)*191 + (低8bit - 0x40)) * 32

ASC:
(ASCII码 - 0x20) * 16; 8x16点阵的(如果是全ASC点阵不要减0x20)

http://blog.csdn.net/boliu218/archive/2011/01/06/6119710.aspx

 

 

区位码,汉字交换码和汉字机内码的概念是什么?
它们之间有什么关系?
 
区位码:
1981 年国家颁布了 GB2312 汉字标准共有 6763 个,其中一级 3755,二级 3008,
还有 682 非汉字字符。并为每个字符规定了标准编码,便于在计算机内部相互转
换。
作为 GB2312 标准只是定义了一张 94×94 的二维表。其中行为区号,列为位号。
这样可以利用区号和位号来找到其中的汉字。这种编码就是我们所说的区位码。 
比如
陈(1934)   区号:19   位号:34,为了处理与存储的方便,每个汉字的区号和
位号在计算机内部分别用一个字节来表示
区位码无法于汉字进行通信,因为 ASCII 码中规定了 OOH-1F 作为控制码使用,
这样就发生了冲突。由于计算机不是中国人发明的所以只能听从于国际标准
ISO2022 规定区号和位号都加上 32(20H),这样就防止冲突。经过加上 32 以后的
编码称为国际交换码
陈-区号:19+32= 51
         00010011+00100000=00110011 
   位号:34+32=66
         00100010+00100000=01000010
  即 5166   16 进制 3342
由于文本中通常混合使用汉字和西文字符,汉字信息如果不予以特别标识,就会
与单字节的 ASCII 码混淆。 此问题的解决方法之一是将一个汉字看成是两个扩展
ASCII 码,使表示 GB2312 汉字的两个字节的最高位都为 1。
这种高位为 1 的双字节汉字编码即为 GB2312 汉字的机内码,简称为“内码”.
00110011 最高位变为 1 则从 33 变为 B3
01000010 最高位变为 1 则从 42 变为 C2
这样一来,陈的机内码应该为 B3C2
这里要说明的是不管你是采用什么样的输入法输入汉字, 其汉字的机内码都是相
同的。
如果要从一个汉字的机内码转换为区位码,其实就是相反的方向进行运算

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
7
关闭 站长推荐上一条 /3 下一条