汉字的区位码和内码,外码,国标码

时间:2024-02-17 22:13:09

1.国标码:“国家标准信息交换用汉字编码”(GB2312-80标准),简称国标码,国标码是二字节码, 用两个七位二进制数编码表示一个汉字。

2.区位码:为了使每一个汉字有一个全国统一的代码,区位码是国家规定的94*94的一个方阵,其中每行叫做一个区,每列叫做一个位,组合起来就组成了区位码,我们可以在相关网站查询某个汉字的区位码,

       例如汉字“我”的区位码是46 50 ,标识“我”在46区,50位。

3.机内码:机内码是在计算机中存储的汉字编码。(相当于ASCII码)

4.外码:  无论是区位码或国标码都不利于输入汉字,为方便汉字的输入而制定的汉字编码,称为汉字输入码,即汉字外码。不同的输入方法,形成了不同的汉字外码。常见的输入法有以下几类:

* 按汉字的排列顺序形成的编码(流水码):如区位码;
* 按汉字的读音形成的编码(音码):如全拼、简拼、双拼等;
* 按汉字的字形形成的编码(形码):如五笔字型、郑码等;
* 按汉字的音、形结合形成的编码(音形码):如自然码、智能ABC。
* 输入码在计算机中必须转换成机内码,才能进行存储和处理。

例如: 在计算机中录入汉字时,从键盘输入的是汉字的机内码, 这个汉字的机内码是由输入法软件直接转换的,再由操作系统或应用软件提取字库字形码显示到屏幕上

三者之间的关系: 

机内码与区位码
机内码高位字节=(区号)H+A0H
机内码低位字节=(位号)H+A0H
国标码与区位码
国标码高位字节=(区号)H+20H
国标码低位字节=(位号)H+20H

 

例如“我”的的区位码是46 50 这是10进制的转化为16进制:2EH 32H

所以“我”的国标码:2E32H+2020H=4E52H

所以“我”机内码:4E52H+8080H=CED2(其实就是把二进制国标码的最高位置1,注意看E和2都没有变化)

机内码转化为2进制就可以再计算机中存储,这里面转化为10进制可以输出。

CED2的10进制为:52946,这里我们打开记事本,按住alt建,输入52946即可以看见“我”,因为52946是“我”的机内码的10进制。

 

这里面有两个问题:

1.为什么不用区位码直接表示国标码,为要加上2020H?

2.机内码为什么要在国标码的基础上加上8080H,而不是直接只用国标码作为机内码?

这里我先解决第二个问题,国标码就是由2个ASCII码组成,为什么呢(这里简单介绍一下,后面会详细说明)?因为在英文中只有26个字母,所以用一个字节就可以表示了,用一个字节的话可以表示2^8个符号,就是256个符号,绰绰有余啊,于是外国人制订了规范,规定0-127(00000000-01111111)个字符他们用了,用来表示英文字符和一些符号,就是ASCII码,但是汉字有很多,256个根本就不够,于是国家就用两个ASCII来表示一个汉字,就是2个字节标识一个汉字,例如“保”的区位码为:1703,所以国标码为:17的16进制,03的16进制+20,20H=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冲突了。

 

关于字符编码的发展:

第一阶段:ASCII阶段,(American Standard Code for Information Interchange, “美国信息交换标准码),计算机当时只支持英语,字符在计算机中都是以0和1的方式存储的。象a、b、c、d这样的52个字母(包括大写)、以及0、1、2等数字还有一些常用的符号(例如*、#、@等)在计算机中存储时也要使用二进制数来表示,而具体用哪些二进制数字表示哪个符号,就必须要有一定的规则,于是美国有关的标准化组织就出台了所谓的ASCII编码,统一规定了上述常用符号用哪个二进制数来表示。(来自百度百科),ASCII码规定每个字符例如“a”使用1个字节来表示,也就是8为的二进制组合,那么就有00000000-11111111一共256种组合,也就是可以表示256个不同的字符。

其中0-31:是控制字符或通讯专用字符(不可以显示的字符,其余为可显示字符),如控制符:LF(换行)、CR(回车)等。

32-126:是字符,其中32是空格,48-57为0-9的阿拉伯数字,65-90为26个大写英文字母,97-122为26个小写英文字母,其余的是一些标点符号,运算符号等。

ASSCII共计有128个,从0到127,也就是从00000000-01111111,最高位都是0。

第二阶段:ANSI编码(本地化)阶段,ASCII只能表示英文字符,那么其他字符怎么表示呢?汉语是这样解决的,用两个ASCII表示一个汉字,而且不用前面的128个,为什么不用已经在上一篇中介绍了,因为前128个事人家的英文。不能占啊,否则就混乱了。比如汉字“中”在中文操作系统中使用[0xD6,0xD0] 这两个字节存储,为什么呢,这里简单解释一下,“中”的区位码是 54 48 ,那么“中”的,国标码就是54 48的十六进制+上2020H=5650H,那么“中”的机内码就是=“中的国标码+8080H=D6D0H,这样每个汉字也都有了自己的编码,汉字编码解决了,这就是中国的GB2312编码标准,但是这是中国汉字的编码,那么其他国家呢?其他的国家的计算机操作系统中可能把[0xD6,0xD0] 这两个字节存储成他们的文字,而不是“中”,不同的国家和地区制定了不同的标准,这些使用 2 个字节来代表一个字符的各种文字延伸编码方式,称为 ANSI 编码。在简体中文系统下,ANSI 编码代表 GB2312 编码,在日文操作系统下,ANSI 编码代表 JIS 编码。不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中。

第三阶段:UNICODE(国际化),为了使国际间信息交流更加方便,国际组织制定了 UNICODE 字符集,为各种语言中的每一个字符设定了统一并且唯一的数字编号,以满足跨语言、跨平台进行文本转换、处理的要求。Unicode用数字0-0x10FFFF来映射这些字符,最多可以容纳1114112个字符,或者说有1114112个码位。码位就是可以分配给字符的数字。UTF-8、UTF-16、UTF-32都是将数字转换到程序数据的编码方案。