编码/解码有什么区别?

我从来没有确定,我明白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中使用单独的bytestringtypes,这不再是一个问题。

将一个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时,这看起来像是一团糟。