详解计算机中的各种编码
最近一直在复习,遇到神马各种码弄得我非常郁闷,最终专题研究了一下,留给自己一份材料,也分享给大家……
本文所说的编码,主要针对字符的IO的编码,不涉及数字编码,视频、音频编码和校验码之类其他编码……
这些资料都是收集自网上各种地方,由于太碎了,所以就不声明引自哪篇文章了……
一、ASCII码
最简单也是最离不开的一种编码,直接对应英文和键盘,计算机中的任何键盘输入都离不开ASCII,每次按下某个键,计算机都得到一个ASCII,无论你输入的是拼音还是五笔,计算机只认识ASCII……
二、汉字编码
1、输入码、内码、字形码
输入码:举例来说,我们所说的输入码就是输入法,比如拼音、五笔什么的,一串字母表示一个汉字(不讨论多个汉字的问题)
内码:汉字在计算机中用于运算和存储所使用的代码,这个代码是统一的
字形码:就是点阵,那些坐标亮,哪些不亮,然后让你看着是一个汉字的形状……
2、区位码、国标码、汉字内码
区位码:就是按照行列的形式吧汉字放在“格”中,然后通过行列数来确定某个汉字的方法,行表示区,列表示位,所以叫区位码。需要特别说明的是,区位码(包括国标码)只是一种编码方法并不是特指某一个编码(比如gb2312)……
国标码:由于当初设计区位码的时候,考虑的比较少,区位码和通信中的控制字符存在二义性,所以ISO就规定将区位码加上2020H变成国标码以消除这种二义性……
汉字内码:虽然解决了通信的问题,但是国标码在计算机的存储中又和ACSII码之间存在二义性,所以又规定在国标码的基础之上再加上8080H变成汉字内码,这样,汉字就可以在计算机中不和任何其他字符编码产生冲突了……
这里需要另外说明一下的是交换码,交换码是一种描述功能的编码(和内码是一起的),与区位码这种描述编码方式的编码没有交集。它表示一种字符在进行数据交换的过程中采用的一种双方都认可的,不会产生冲突的编码方式。实际上ASCII就是即是内码(不是汉字内码,就叫内码),也是交换码,而汉字编码中只有汉字内码才是交换码,区位码和国标码只是给人看的编码,必须变成内码才能被计算机使用……
3、GB2312、GBK、GB18030
这三种编码如果要和上面的汉字编码方式对应,都应该算作区位码,也就是说都是按照行列的形式用数字标识汉字的。但是很多人会想当然的认为看到了GB就是国标码,实则不然,这里的GB表示我们提出了一个汉字的国际标准编码方式,而我们上面说的国标码是一个技术上的概念(但是都叫国标码,所以经常容易被人误解)。况且这三种编码并不都是国家标准,我们最常见的GBK就不是国家标准,而是在GB2312之上的一种扩展,可是算是事实上的标准。这三种编码的兼容顺序是GB18030兼容GBK,GBK兼容GB2312……
unicode(万国码,名字很囧)
这种编码方式是为了囊括全世界的语言而提出的一种编码标准,需要注意的是,这个标准是给人看的标准而不是给计算机看的标准,所以我们讨论编码的时候从来不讨论unicode编码,而是讨论utf8,utf16和utf32,这三种编码是专门为计算机设计的编码,虽然都是根据unicode标准,但却是3种不同的格式,我们通常说的unicode编码,实际上指的是utf16编码……
另外,汉字的编码(区位码)和ASCII是不兼容的(所以要变成内码,利用高位来判断是哪种编码),但是unicode编码和ASC
II是兼容的,也就是说ASCII是unicode码的一个子集……