汉字的区位码和内码,外码,国标码
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都是将数字转换到程序数据的编码⽅案。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论