python编码整理
bit
比特: 一比特为一个高低电平 2
bytes
字节 由8个比特组成,可以表示2^8个不同的符号
ascii
每个ascii码由一个byte组成
gb231
表示中文的编码,ascii前128中包含了所有英文字母和数字,但中文博大精深,仅仅用剩下的ascii码不够与汉字一一对应,于是用两个127位之后的byte组合为一个汉字
gbk/gb18030
由两个byte组成,只要首位为127之后的byte 即表示一个汉字
unicode
为了统一不同地区不同编码方式,规定所有字符(包括英文、数字、汉字等等)都由两个byte组成
utf-8
由于unicode表示英文等的时候浪费太严重,故utf-8诞生了,utf-8可由1-4byte组成,utf-8去掉了前面的0位byte,根据不同符号变化字节长度,大大节省了空间
unicode用于内存中,utf-8用于文件存储,故大大节省了存储空间
python2
str和unicode
str和unicode都是basestring的子类。严格意义上说,str其实是字节串,它是unicode经过编码后的字节组成的序列。对UTF-8编码的str'苑'使用len()函数时,结果是3,因为utf8编码的'苑'
== '\xe8\x8b\x91'。
而unicode是一个字符串,str是unicode这个字符串经过编码(utf8,gbk等)后的字节组成的序列。如上面utf8编码的字符串'汉'。
unicode才是真正意义上的字符串,对字节串str使用正确的字符编码进行解码后获得,并且len(u'苑') == 1。
在Py2里,str=bytes。
py2编码的最大特点是Python 2 将会自动的将bytes数据解码成 unicode 字符串
所以在2里我们可以将字节与字符串拼接。
python3
跟 Python 2 类似,Python 3 也有两种类型,一个是 Unicode,一个是 byte 码。但是他们有不同的命名。
现在你从普通文本转换成 “str” 类型后存储的是一个 unicode, “bytes” 类型存储的是 byte 串。你也可以通过一个 b 前缀来制造 byte 串。
python3最重要的新特性大概要算是对文本和二进制数据作了更为清晰的区分。文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示。Python3不会以任意隐式的方式混用str和bytes,正是这使得两者的区分特别清晰。你不能拼接字符串和字节包,也无法在字节包里搜索字符串(反之亦然),也不能将字符串传入参数为字节包的函数(反之亦然)。这是件好事。
Python 3 中对 Unicode 支持的最大变化就是将会没有对 byte 字节串的自动解码。如果你想要用一个 byte 字节串和一个 unicode 相链接的话,你将会得到一个错误,不管你包含的内容是什么。
所有这些在 Python 2 中都将会有隐式的处理,而在 Python 3 中你将会得到一个错误。