技术的乐趣在于分享,欢迎多多交流,多多沟通。
全部博文(877)
分类: 嵌入式
2014-08-24 14:57:14
区位码是中国定义的94乘以94的一个表。一个字节只用低七位的话有127中状态。英文中0到32的字符都是些控制字符,第127位是del字符,即删除字符,所以总共有34个控制字符。(从0到127)128减去(从0到32是33加上第127位的那一个字符共34)34等于94。所以可供中文使用的是94个状态。 国标码其实就是交换码,是中国用来交换的,当然交换码是不能引起歧义的,94行94列的一个编码再加上32就是行号从33到126列号也是从33到126。这样就与0~32的英文控制字符没有冲突了。 其实你在记事本里键入tab键然后用十六进制查看器查看一下就知道tab键对应的十进制是9。所以在中文输入法状态下还是会用到英文的34个控制字符的。也就是说人家美国已经制定了这些控制字符,咱们借来用就是了。 国标码也是用来交换的,最高位是0,最好是避开人家的控制字符,所以就剩下94个了。 其实我个人认为,完全可以用128*128这样的表。因为,我们的两字节汉字最高位(机内码最高位是1)是1,已经完全和英文区分开了,没必要用什么国标码之类的中间技术,直接就是区位码和机内码,机内码=区位码-1+128(区位码是从1开始算起的,其实真正的范围是0到127,但总数是一样的128),这样多省事啊 但国家由国家的想法,我也不清楚 哎 总之这个问题也不要去深究了,这是国家编码人员负责的事情,咱只要知道怎么用就行了。你只要记住加上32是为了避免和英文的控制字符冲突就行了。
2.机内码为什么要在国标码的基础上加上8080H,而不是直接只用国标码作为机内码?
这里我先解决第二个问题,
国标码就是由2个ASCII码组成,为什么呢(这里简单介绍一下,后面会详细说明)?因为在英文中只有26个字母,所以用一个字节就可以表示了,用一个字节的话可以表示2^8个符号,就是256个符号,绰绰有余啊,于是外国人制订了规范,规定0-127(00000000-01111111)个字符他们用了,用来表示英文字符和一些符号,就是ASCII码,但是汉字有很多,256个根本就不够,于是国家就用两个ASCII来表示一个汉字,就是2个字节标识一个汉字,例如“保”的区位码为:1703,所以国标码为:1703的10进制+2020H=3123H,
然而:31H 和23H在ASCII中式有值的,31H在ASCII中表示数字1,23H表示的是“#”(这个可以在网上查询),那么如果我以国标码作为机内码的话,如果内存中有两个字节为31H和23H,那么到底是表示汉字“保”呢?还是字符1#呢?这样就有了歧义,但是解决办法就有了,0-127不是被英文字符占了吗?那么我就用127之后的来表示不就可以了吗?于是我把汉字的两个字节每个字节机上128(16进制就是80H),于是问题解决了,汉字“保”的机内码变为:3123H+8080H=B2A3H(10进制就是45475),打开记事本按住alt+45475看看是不是“保”,这样就不会和英文的ASCII冲突了。
1.国标码:“国家标准信息交换用汉字编码”(GB2312-80标准),简称国标码。
国标码是二字节码, 用两个七位二进制数编码表示一个汉字。
2.区位码:为了使每一个汉字有一个全国统一的代码,区位码是国家规定的94*94的一个方阵,其中每行叫做一个区,每列叫做一个位,组合起来就组成了区位码,我们可以在相关网站查询某个汉字的区位码,例如汉字“我”的区位码是46 50 ,标识“我”在46区,50位。
3.机内码:机内码是在计算机中存储的汉子编码。(相当于AcsiII码)
三者之间的关系。
国标码=16进制的区位码+2020H
机内码=国标码+8080H
区位码---(+2020H)----->国标码----(+8080H)----->内码
区位码 = 内码 + A0A0H
例如“我”的的区位码是46 50 这是10进制的转化为16进制:2E32H
所以“我”的国标码:2E32H+2020H=4E52H
所以“我”机内码:4E52H+8080H=CED2(其实就是把二进制国标码的最高位置1,注意看E和2都没有变化)
机内码转化为2进制就可以再计算机中存储,这里面转化为10进制可以输出。
CED2的10进制为:52946,这里我们打开记事本,按住alt建,输入52946即可以看见“我”,因为52946是“我”的机内码的10进制。