编码方式:一个字节包括八个比特位,每个比特位表示0或1,一个ASCII编码使用一个字节(如10101000),因此ASCII编码方式只能表示 2 7 = 128 ( 除 去 字 节 的 最 高 位 作 为 作 奇 偶 校 验 位 ) 2^7=128(除去字节的最高位作为作奇偶校验位) 27=128(除去字节的最高位作为作奇偶校验位)。这样表示字符有限,像汉字字符就没法表示了,因此又出现了出现了Unicode编码。Unicode编码通常由两个字节组成,共表示 256 ∗ 256 256*256 256∗256个字符,即所谓的UCS-2。某些偏僻字还会用到四个字节,即所谓的UCS-4。但是这样很浪费内存空间,因此又出现可变长的编码方式UTF-8编码。UTF-8可以表示,从英文字母的一个字节,到中文的通常的三个字节,再到某些生僻字的六个字节,也兼容ASCII编码。我国有一套自己编码方式:GB2312和GBK。
1.encode与decode
在Python3.X 源码文件中默认使用utf-8编码,所以可以正常解析中文,无需指定 UTF-8 编码。:
import sys
print(sys.getdefaultencoding())
输出:
utf-8
我们可以直接调用decode,ecode来实现编码和解码,encode的作用,使我们看到的直观的字符转换成计算机内的字节形式,decode刚好相反,把字节形式的字符转换成我们看的懂的、直观的、“人模人样”的形式,比如:
a="中文"
a = bytes(a,encoding='utf-8')
print(type(a),a,len(a))
mid=a.decode()
print(type(mid),mid,len(mid))
输出:
<class 'str'> 中文 2
<class 'bytes'> b'\xe4\xb8\xad\xe6\x96\x87' 6
<class 'str'> 中文 2
此处先通过bytes(a,encoding=‘utf-8’)先转化为utf-8编码的字节流,然后可以直接通过decode()转化为正常可见字符串,默认的decode是utf-8的,若是其他编码方式,要把此参数填写上。比如:
a="中文"
a=bytes(c,encoding='gb2312')
print(type(a),a,len(a))
mid=a.decode()
print(type(mid),mid,len(mid))
输出:
<class 'str'> 中文 2
<class 'bytes'> b'\xd6\xd0\xce\xc4' 4
<class 'str'> 中文 2
据说字符在计算机的内存中统一是以Unicode编码的。只有在字符要被写进文件、存进硬盘或者从服务器发送至客户端(例如网页前端的代码)时会变成utf-8。unicode-escape将Unicode的内存编码值进行存储,读取文件时在反向转换回来。这里我们可以是使用encode(‘unicode-escape’)将字符以Unicode的字节形式表现出来:
a="中文"
print(type(a),a,len(a))
a = bytes(a,encoding='unicode_escape')
print(type(a),a,len(a))
mid=a.decode("unicode_escape")
print(type(mid),mid,len(mid))
输出:
<class 'str'> 中文 2
<class 'bytes'> b'\\u4e2d\\u6587' 12
<class 'str'> 中文 2
2.codecs
codecs是专门用作编码转换
解码:
import codecs
look2=codecs.lookup("gb2312")
c="中文"
mid=look2.encode(c)
print(type(mid),mid,len(mid))
mid=look2.decode(mid[0])
print(type(mid),mid,len(mid))
输出:
<class 'tuple'> (b'\xd6\xd0\xce\xc4', 2) 2
<class 'tuple'> ('中文', 4) 2
看输出,codecs的encode和decode输出的是tuple,第一位是值,第二位是长度。