编码的理论知识-小结
编码的理论知识-小结
一、背景
关于电脑的疑问。
1、abcd这样的字符信息,是以怎样的01序列存到电脑硬盘的,占用了多少个字节?
2、汉字“中国”这样的字符信息,又是以怎样的01序列存到电脑中的,又占用了几个字节?
3、编码格式有:ASCII、GBK、BIG、UTF-8、UTF-16等,采用不同的编码格式,文字符号信息在电脑中存储的01序列就不会一样,分别占多少个字节?按什么规则生成01序列?
种种问题,就需要我们搞懂编码的理论知识。
二、解决问题
1、为什么要编码?
答:电脑只认识0和1,不认识人类易读的文字和符号。所以电脑存储数据前,就需要把文字符号转变成01序列,这个转换过程就是编码。
如:按照ASCII编码表,将符号 “a” 编码成的01序列就是,0110 0001 (10进制表示为97;16进制表示为0X61),容量为1个字节(8个bit位)。
2、什么是编码?
答:编码就是建立一种文字符号和01序列的对应关系,存到电脑中的就是01序列,显示给人类看的时候就是文字符号图形。
编码时,将文字符号按照某个指定的编码表转为01序列,存到电脑中;
解码时,将电脑中存储的01序列按照相同的某个指定编码表转为文字符号图形。
编码如:
按照GBK编码表,将符号 a 编码成的01序列就是,0110 0001 (10进制表示为97;16进制表示为0X61),容量为1个字节(8个bit位)。
按照GBK编码表,将符号 “啊” 编码成的01序列就是,1011 0000, 1010 0000(10进制表示为176,160;16进制表示为0XB0,0XA0),容量为2个字节(16个bit位)。
3、什么是编码格式(编码表)?
答:编码格式,也可以称之为编码表。文字符号和01序列的对应关系就是编码表。
常见编码格式:ASCII、GBK、UTF-8等。
4、常见编码格式的编码特点?
(1)ASCII(美国专用)
1个字节(8个bit位)表示一个文字符号。最高位为0,形如:0xxx xxxx。从0000 0000 到 0111 1111(10进制的127)总共可以表示128个文字符号(包括不能打印的控制符、可打印的字母、数字、标点符号)。
(2)GBK(中国专用)
由于ASCII中只包含了美国使用的文字符号,所以美国之外的国家就自己发明了自己的编码表。以中国的GBK为例。
1)GBK为了可以扩大01序列种类的总数,采取2个字节表示一个汉字符号的方式。即2个字节的01序列来表示一种01序列。
2)GBK为了GBK可正确的解码按照ASCII编码表编码过的01序列信息,所以采取了兼容ASCII码的措施进行编码。
GBK编码表实现以上原则的措施如下:
按照GBK编码表解码,每1个字节(8个bit位)的最高位为0时(0xxx xxxx),就按照ASCII编码表来解码为对应符号。如0110 0001 (10进制表示为97;16进制表示为0X61)按照ASCII编码表解码后就是符号“a”。
按照GBK编码表解码,每1个字节(8个bit位)的最高位为1时(1xxx xxxx),就再读取后面紧跟的1个字节(第2个字节,8个bit位),并且GBK规定第2个字节的最高位也要是1(1xxx xxxx),2个字节凑齐16个bit位(1xxx xxxx,1xxx xxxx)共同表示一个汉字符号。如:汉字符号“中”,在GBK编码表中对应的01序列为1101 0110,1101 0000(10进制表示为214,208;16进制表示为0XD6,0XD0),容量为2个字节。
延伸:其他国家和地区也类似GBK发明了自己的国家文字符号的编码表。如:日本的JP系列、台湾的Big系列。
(3)UTF-8(全球通用)
虽然各国编码表都兼容了美国的符号(ASCII),但是ASCII没有兼容美国和本国之外的其他所有国家的符号,所以,中国的GBK数据通过网络发送到日本后,日本就不能通过JP系列编码表正确解码。
有人就会说,可以在日本的电脑上预装好GBK编码表不就解决了吗?答案是可以这么干,但是不推荐。原因是,如果日本预装中国的GBK编码表,才能正确解码中国的数据,那么日本的电脑是不是还要预装韩国的HG编码表、朝鲜的CX编码表,阿拉伯的ALB编码表呢?所有日本之外国家的编码表都要预装一遍,同理,中国也要把中国之外的其他国家的编码表在电脑里预装一遍。这样很费事,一旦用户搞不清数据来自哪个国家,就不知道用哪种编码表解码了。
于是万国码Unicode系列出现了。Unicode系列包括3种编码表UTF-32(4字节表示一个符号)、UTF-16(2字节表示一个符号)、UTF-8(1、2、3个字节表示一个符号)。
这里以UTF-8为例进行说明:
1)UTF-8编码表兼容ASCII编码表
2)UTF-8编码表还将除了ASCII编码表符号之外的全世界的文字符号都包括了进来,所以又称万国码。
3)UTF-8编码表实现了1、2、3可变字节编码,1、2、3个字节都用于UTF-8表示文字符号。其中,汉字符号、日文符号、韩文符号等,1个文字符号就占3个字节。
UTF-8编码表实现以上原则的措施如下:
0xxx xxxx :1字节格式,表示1个文字符号(就是ASCII编码表)。
按照UTF-8编码表解码,每1个字节(8个bit位)的最高位为0时(0xxx xxxx),就按照ASCII编码表来解码为对应符号。如0110 0001 (10进制表示为97;16进制表示为0X61)按照ASCII编码表解码后就是符号“a”。
110x xxxx,10xx xxxx :2字节格式,表示1个文字符号。
按照UTF-8编码表解码,每1个字节(8个bit位)的最高位为110时(110x xxxx),就再读取紧跟的1个字节(第2个字节),并且UTF-8规定第2个字节的最高位要是10(10xx xxxx)。2个字节凑齐16个bit位(110x xxxx,10xx xxxx )共同表示一个文字符号。
1110 xxxx,10xx xxxx,10xx xxxx :3字节格式,表示1个文字符号。
按照UTF-8编码表解码,每1个字节(8个bit位)的最高位为1110时(1110 xxxx),就再读取紧跟的2个字节(第2、3个字节),并且UTF-8规定第2、3个字节的最高位要是10开头(10xx xxxx,10xx xxxx)。3个字节凑齐24个bit位(1110 xxxx,10xx xxxx,10xx xxxx )共同表示一个文字符号。
5、什么是Unicode和base64编码表
(1)编码的基础表
Unicode编码表,是UTF-32、UTF-16、UTF-8的基础表。
Unicode编码表的作用是,先将全世界的符号都收集齐全,再对每一个符号进行编号(以10进制编号来说明),这个编号转为二进制的01序列表示,然后用于填充UTF编码格式中的x位置(bit位)。
编号的具体做法是,Unicode中的美国符号的编号继续和ASCII编码表的编号保持一致,其他所有国家的符号则按一定规则编号。当每个符号都在Unicode编码表中有了唯一的编号后,后面就是利用这些编号,转为对应的二进制01序列B(如,汉字符号“啊”在Unicode编码表的编号为21834,二进制表示为101 0101,0100 1010),再根据UTF-32、UTF-16、UTF-8的编码规则,将01序列B填充到各种UTF的x位置(bit位)。以UTF-8格式表示汉字符号“啊”为例,21834需要使用3个字节来表示,UTF-8的3个字节表示一个符号的格式为:24个bit位(1110 xxxx,10xx xxxx,10xx xxxx )共同表示一个文字符号。那么01序列B(101 0101,0100 1010,共有7+8=15个bit位)来填充x位置(16个x位置),显然序列B的bit位不够,所有在序列B最前面补充一个0,变成序列C(0101 0101,0100 1010,共有8+8=16个bit位),在将序列C中的16个bit信息从左到右,一次填充到1110 xxxx,10xx xxxx,10xx xxxx中的x位置,得到1110 0101,1001 0101,1000 1010。(此时用10进制表示为15046026;16进制表示为E5,95,8A)
(2)上层编码表
如果其他编码是为符号转为01序列而产生的,那么base64编码就是为01序列转为符号(64+1=65个符号)而存在的。
base64编码表,是用于处理01序列再编码的事情的,且编码是可逆的。如:把小图片01序列用base64编码成字符表示。
以图片的01序列为例:
base64拿到一个01序列,就开始每3个字节(24个bit位)作为一个单位(不足3个字节的末尾补充0),并将该单位的24bit划分为4个小组,每个小组就是6bit(就是3/4个字节)。0到111 111(10进制的63),共有64个编号,分别对应26个字母*2+10个数字+加号+斜线。如000 001表示在base64编码表中表示字符“B”,那么图片中的000 001数据就对应字符“B”在文本保存时的编码,采用GBK保存文本时,“B”对应ASCII码中的十进制66,即为二进制0010 0010,所以最终图片中的000 001数据保存通过base64编码后到电脑中就是0010 0010,打开文档则显示字符“B”,通base64解码后则还原为原图片的数据000 001。
6、编码表举例
(1)ASCII编码表
https://www.cnblogs.com/andy9468/p/13039201.html
(2)GBK编码表
https://blog.csdn.net/huangxy10/article/details/10012147
(3)UTF-8编码表
https://www.cnblogs.com/novaCN/p/6052787.html
(4)Unicode编码表
https://www.cnblogs.com/csguo/p/7401874.html
延伸:符号的编码查询