编码/解码有什么区别?

时间:2009-01-15 15:14:00

标签: python string unicode character-encoding python-2.x

我从未确定我理解str / unicode解码和编码之间的区别。

我知道str().decode()适用于你知道有一个字符串的字符串,你知道它有一个特定的字符编码,假设编码名称会返回一个unicode字符串。

我知道unicode().encode()根据给定的编码名称将unicode字符转换为字节字符串。

但我不明白str().encode()unicode().decode()的用途。任何人都可以解释,并可能还纠正我上面遇到的任何其他错误吗?

编辑:

有几个答案提供.encode对字符串的作用的信息,但似乎没有人知道.decode对unicode的作用。

7 个答案:

答案 0 :(得分:101)

unicode字符串的decode方法实际上根本没有任何应用程序(除非你出于某种原因在unicode字符串中有一些非文本数据 - 见下文)。我认为这主要是出于历史原因。在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()也是多余的。

但是后一种方法的另一个应用是有用的:encodings与字符集无关,因此可以应用于8位字符串一种有意义的方式:

>>> s.encode('zip')
'x\x9c;\xbc\r\x00\x02>\x01z'

你是对的:这些应用程序对“编码”的模糊用法是......笨拙。同样,在Python 3中使用单独的bytestring类型,这不再是一个问题。

答案 1 :(得分:68)

将unicode字符串表示为字节串称为 encoding 。使用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' codec can't encode characters in position 0-5: 
    ordinal not in range(128)

通常在需要将其用于IO时编码unicode字符串,例如通过网络传输,或将其保存到磁盘文件中。

将字符串转换为unicode字符串称为解码。使用unicode('...', encoding)或'...'。decode(encoding)。

示例:

   >>> u'æøå'
   u'\xc3\xa6\xc3\xb8\xc3\xa5' # the interpreter prints the unicode object like so
   >>> 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'

每当从网络或磁盘文件接收字符串数据时,通常会解码一串字节。

我相信在python 3中unicode处理有一些变化,所以上面的python 3可能不正确。

一些好的链接:

答案 2 :(得分:15)

anUnicode。 encode ('encoding')会产生字符串对象,并且可以在unicode对象上调用

aString。 decode ('encoding')会产生 unicode 对象,并且可以在字符串上调用,以给定的编码进行编码。


更多解释:

您可以创建一些unicode对象,该对象没有任何编码集。 Python在内存中存储的方式无关紧要。你可以搜索它,拆分它并调用你喜欢的任何字符串操作函数。

但有一段时间,当你想将你的unicode对象打印到控制台或某个文本文件时。所以你必须编码它(例如 - 在UTF-8中),你调用encode('utf-8'),你得到一个带'\ u&lt; someNumber&gt;'的字符串在里面,这是完全可打印的。

然后,再次 - 你想做相反的事情 - 用UTF-8编码读取字符串并将其视为Unicode,因此\ u360将是一个字符,而不是5.然后你解码一个字符串(带有选定的编码)并获得unicode类型的全新对象。

正如旁注 - 你可以选择一些变态编码,比如'zip','base64','rot',其中一些将从字符串转换为字符串,但我相信最常见的情况是涉及的UTF-8 / UTF-16和字符串。

答案 3 :(得分:12)

mybytestring.encode(somecodec)对somecodec的这些值有意义:

  • base64
  • BZ2
  • 的zlib
  • 六角
  • quopri
  • ROT13
  • string_escape
  • UU

我不确定解码已经解码的unicode文本有什么用处。尝试使用任何编码似乎总是尝试首先使用系统的默认编码进行编码。

答案 4 :(得分:8)

您应该阅读Python UnicodeDecodeError - Am I misunderstanding encode。在阅读了接受的答案后,我对Python中unicode的理解更加清晰。

答案 5 :(得分:5)

有一些编码可用于从str到str或从unicode到unicode进行解码/编码。例如base64,hex或甚至rot13。它们列在codecs module

编辑:

unicode字符串上的解码消息可以撤消相应的编码操作:

In [1]: u'0a'.decode('hex')
Out[1]: '\n'

返回的类型是str而不是unicode,这在我看来是不幸的。但是当你没有在str和unicode之间进行适当的en / /解码时,无论如何这看起来都像是一团糟。

答案 6 :(得分:0)

简单的答案是他们彼此完全相反。

计算机使用非常基本的字节单元来存储和处理信息,这对人眼来说毫无意义。

例如,'\ xe4 \ xb8 \ xad \ xe6 \ x96 \ x87'是两个中文字符的表示,但计算机只知道(意思是打印或存储)当它们被给予字典时是汉字。寻找那个中文单词,在这种情况下,它是“utf-8”字典,如果你查看一个不同或错误的字典(使用不同的解码方法),它将无法正确显示预期的中文单词。

在上述情况下,计算机查找中文字的过程是decode()。

计算机将中文写入计算机内存的过程是encode()。

所以编码信息是原始字节,解码信息是原始字节和要引用的字典的名称(但不是字典本身)。

相关问题