python str是什么编码

Python012

python str是什么编码,第1张

python

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'忽略错误的字节

注意格式化的数据格式