最近整理旧物时,翻到了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
这里要说明的是不管你是采用什么样的输入法输入汉字, 其汉字的机内码都是相
同的。
如果要从一个汉字的机内码转换为区位码,其实就是相反的方向进行运算
文章评论(0条评论)
登录后参与讨论