注:封面图片来自互联网
首先来看看编解码的由来:
我们都知道计算机发明与美国,官方语言使用的是英语,英语语系里,使用的字符非常有限字母,数字再加几个特殊符号就能满足几乎所有的需要。通过一个字节七位就能表示出来(8位=2**8=256> 26*2字母+10数字+66标点符号控制符),一般是通过后七位来表示,最高常用作通信过程中的校验位。由于这个标准是由美国国家标准协会ANSI制定的,所以被称作ASCII码。ASCII码是单字节编码,如果计算机只限定于英语语系里使用那也没什么问题,可是技术无国界,来着不拒。当在非英语语系里使用的时候,例如在我们亚洲国家语系里,单字节编码就显得捉襟见肘,例如我们汉语中是由一个个汉字组成的,汉语里的常用汉字少说也有几千个,就有了类似GBK的编码方式。同样在非洲,欧洲,拉丁美洲都有不同的语系,如果各自都有自己单独的一种编码方式,在“地球村”的时代交流起来实在麻烦,所以就有了一种统一编码方式的出现unicode。统一编码方式既要能满足各语系的需求,又不至于太浪费空间,Unicode也有多种实现方式。这里我们讨论Python的编码方式主要是针对Unicode的一种实现方式utf-8和ascii码的。
Python的编码方式:
讨论Python的编码方式,要对Python2和Python3分开进行,因为这两个版本之间的编码方式完全不同。Python2中字符序列类型的表示方式有str和Unicode两种方式。Str默认编码方式是ascii码,当字符为汉字或其他语系时,需要显示指定编码方式,# coding=utf-8 或 # -*- coding: utf-8 -*。对应的是汉字在计算机内部存储的内码,以这种方式支持不同语系之间ascii编码后的操作。
字符数据从str码到Unicode的转换称为解码,从Unicode到str码的转换称为编码。Python2在编解码过程中默认使用ascii码进行的。如上的例子,s的内码显然是无法被ascii(0-128)编解码的,就会报出类似“UnicodeDecodeError: 'ascii'codec can't decode byte 0xe7 in position 0: ordinal not in range(128)” 的错误。只要显示指定解码方式就可以避免类似的错误。根本原因是在Python2中允许类似字节码和ascii码的默认转化,这个在Python3中是不允许的。
Python3中的字符序列类型也有两种表示方式str和bytes。Str默认编码方式为Unicode,str到bytes的转换称为编码,从bytes到str称为解码。由于Python3默认采用Unicode,所以能支持多种语系而不需要显示指定Unicode编码。
Bytes字节码是基于ascii编解码的,所以在Python3中直接定义中文字符的字节码类型就会出现错误。
领取专属 10元无门槛券
私享最新 技术干货