3中的str类型对象有点像python
2中的unicode。
python
3中的str是未编码的,str有一个encode方法,调用这个方法后将产生一个编码后的byte类型的字符串(这有点像python
2中的str)。而byte类型的字符串支持解码操作。
例如:
>>>
s
=
'海阔天空'
>>>
hasattr(s,
'decode')
false
>>>
bs
=
s.encode('utf-8')
>>>
type(bs)
<class
'bytes'>
>>>
bs
b'\xe6\xb5\xb7\xe9\x98\x94\xe5\xa4\xa9\xe7\xa9\xba'
>>>
hasattr(bs,
'encode')
false
>>>
bs.decode('utf-8')
'海阔天空'
注意:python
3中str不再具有decode方法,因为它存储的是“未编码”的字符串。decode操作交由byte完成了。
下面一张图搞懂编码、解码、编码表之间的关系。
不难看出,它们是一种根据编码表进行翻译、映射的过程:
实际上,字符串类型只有encode()方法,没有decode()方法,而bytes类型只有decode()方法而没有encode()方法。
二进制格式的数据也常称为裸数据(raw data),所以str数据经过编码后得到raw data,raw data解码后得到的str。
上面说了,编码是将字符数据转换成字节数据(raw data),解码是将字节数据转换成字符数据。在Python中字符数据也就是字符串,即str类型,字节数据也就是bytes类型或bytearray类型。
编码时,可以使用字节类型的构造方法bytes()、bytearray()来构造字节,也可以使用str类型的encode()方法来转换。
解码时,可以使用str类型的构造方法str()来构造字符串,也可以使用bytes、bytearray()类型的decode()方法。
另外需要注意的是,编码和解码的过程中都需要指定编码表(字符集),默认采用的是utf-8字符集。
例如,使用encode()的方式将str编码为bytes数据。
使用bytes()和bytearray()将str构造成bytes或bytearray数据,这两个方法都要求str->byte的过程中给定编码。
实际上,bytes()、bytearray()这两个方法构造字节数据的时候还有点复杂,因为可以从多个数据源来构造,比如字符串、整数值、buffer。如何使用这两个方法构造字节数据,详细内容参考help(bytes)和help(bytearray)给出的说明,这里给几个简单示例。
构造bytes的方式:
构造bytearray的方式:
解码是字节序列到str类型的转换。
例如,使用decode()方法进行解码"我"字,它的utf-8的编码对应为"\xe6\x88\x91":
使用str()进行转换。
当编码、解码的过程使用了不同的(不兼容的)编码表时,就会出现乱码。所以,解决乱码的唯一方式是指定对应的编码表进行编码、解码。
例如,使用utf-8编码"我"字,得到一个bytes序列,然后使用gbk解码这个bytes序列。
这里报错了,因为utf-8的字节序列里有gbk无法解码的字节。如果使用文本编辑器一样的工具去显化这个过程,得到的将是乱码字符。
原文地址: https://www.cnblogs.com/f-ck-need-u/p/10185965.html
对于单个字符的编码,Python提供了ord()函数获取字符的整数表示,chr()函数把编码转换为对应的字符:
最常用的编码是UTF-8,如果没有特殊业务要求,请牢记仅使用UTF-8编码。
在爬虫中会经常遇见,需要用encode和decode来进行互相转码
str转bytes
注意,含有中文字符的str不能用acsii格式转码
bytes转str
** 程序中经常会遇到个别字符转码不成功而报错,因此在decode方法中需要这个参数errors='ignore'忽略错误的字节
注意格式化的数据格式