编码/解码有什么区别?
我从来没有确定,我明白str / unicode解码和编码之间的区别。
我知道str().decode()
是用于当你有一个字节的string,你知道有一个特定的字符编码,给定的编码名称,它将返回一个Unicodestring。
我知道unicode().encode()
根据给定的编码名称将unicode字符转换为一个字节的string。
但是我不明白str().encode()
和unicode().decode()
是什么。 任何人都可以解释,也可能还纠正我上面错了什么?
编辑:
几个答案给出了.encode
在string上做了什么的信息,但是似乎没有人知道.decode
对于unicode所做的。
unicodestring的decode
方法实际上根本没有任何应用程序(除非由于某种原因在unicodestring中有一些非文本数据 – 请参阅下文)。 主要是出于历史原因,我想。 在Python 3中,它完全消失了。
unicode().decode()
将使用默认(ascii)编解码器执行s
的隐式编码 。 确认如下:
>>> s = u'ö' >>> s.decode() Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 0: ordinal not in range(128) >>> s.encode('ascii') Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 0: ordinal not in range(128)
错误消息是完全一样的。
对于str().encode()
来说,这是相反的方法 – 它使用默认编码尝试隐式解码 s
:
>>> s = 'ö' >>> s.decode('utf-8') u'\xf6' >>> s.encode() Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)
像这样使用str().encode()
也是多余的。
但后一种方法的另一个应用是有用的:有一些编码与字符集无关,因此可以以有意义的方式应用于8位string:
>>> s.encode('zip') 'x\x9c;\xbc\r\x00\x02>\x01z'
不过,你是对的:这两个应用程序的“编码”的模糊用法是… awkard。 同样,在Python 3中使用单独的byte
和string
types,这不再是一个问题。
将一个Unicodestring表示为一串字节被称为编码 。 使用u'...'.encode(encoding)
。
例:
>>>u'æøå'.encode('utf8') '\ XC3 \ X83 \ XC2 \ xa6 \ XC3 \ X83 \ XC2 \ XB8 \ XC3 \ X83 \ XC2 \ xa5' >>>u'æøå'.encode('latin1') '\ XC3 \ xa6 \ XC3 \ XB8 \ XC3 \ xa5' >>>u'æøå'.encode('ascii') UnicodeEncodeError:'ascii'编解码器无法编码0-5位置的字符: 顺序不在范围内(128)
通常,您需要使用unicodestring对IO进行编码,例如通过networking传输,或将其保存到磁盘文件中。
将一串字节转换为一个unicodestring称为解码 。 使用unicode('...', encoding)
或'…'。decode(encoding)。
例:
>>>u'æøå' u'\ xc3 \ xa6 \ xc3 \ xb8 \ xc3 \ xa5'#解释器像这样打印unicode对象 >>> unicode('\ xc3 \ xa6 \ xc3 \ xb8 \ xc3 \ xa5','latin1') U '\ XC3 \ xa6 \ XC3 \ XB8 \ XC3 \ xa5' >>>'\ xc3 \ xa6 \ xc3 \ xb8 \ xc3 \ xa5'.decode('latin1') U '\ XC3 \ xa6 \ XC3 \ XB8 \ XC3 \ xa5'
当您从networking或磁盘文件接收到string数据时,您通常会解码一串字节。
我相信python 3中的unicode处理有一些变化,所以上面的python 3可能是不正确的。
一些好的链接:
- 绝对最低限度的每个软件开发人员绝对,积极地必须知道Unicode和字符集(没有借口!)
- Unicode HOWTO
mybytestring.encode(somecodec)对somecodec
这些值是有意义的:
- BASE64
- BZ2
- zlib的
- hex
- quopri
- ROT13
- string_escape
- UU
我不知道解码一个已经解码的Unicode文本是有益的。 尝试使用任何编码似乎总是尝试使用系统的默认编码首先进行编码。
anUnicode。 编码 ('编码')结果在一个string对象,并可以在一个unicode对象上调用
ASTRING。 decode ('encoding')产生一个unicode对象,并且可以在给定编码中编码的string上被调用。
更多的解释:
你可以创build一些没有任何编码集的unicode对象。 它被Python存储在内存中的方式不关你的事。 你可以search它,分割它,并调用你喜欢的任何string操作函数。
但有一段时间,当你想打印你的unicode对象控制台或一些文本文件。 所以你必须对它进行编码 (例如在UTF-8中),你可以调用encode('utf-8'),并且你可以得到一个带有\ u <someNumber>的string,这个string是完全可打印的。
然后,再一次 – 你想做相反的事情 – 读取以UTF-8编码的string,并将其视为Unicode,所以\ u360将是一个字符,而不是5.然后,您解码一个string(与选定的编码)和获得unicodetypes的全新对象。
正如一个侧面说明 – 你可以select一些变形编码,如“zip”,“base64”,“腐烂”,其中一些将从string转换为string,但我相信最常见的情况是涉及UTF-8 / UTF-16和string。
你应该阅读Python UnicodeDecodeError – 我误解编码 。 在阅读接受的答案后,我对Python中的unicode的理解就清晰得多了。
有几个编码可以用来从str到str或从unicode到unicode进行解码/编码。 例如base64,hex或甚至rot13。 它们在编解码器模块中列出。
编辑:
unicodestring上的解码消息可以撤消相应的编码操作:
In [1]: u'0a'.decode('hex') Out[1]: '\n'
返回的types是str而不是unicode,这在我看来是不幸的。 但是,当你没有在str和unicode之间进行正确的en / decode时,这看起来像是一团糟。