我从未确定我理解str / unicode解码和编码之间的区别。
我知道str().decode()
适用于你知道有一个字符串的字符串,你知道它有一个特定的字符编码,假设编码名称会返回一个unicode字符串。
我知道unicode().encode()
根据给定的编码名称将unicode字符转换为字节字符串。
但我不明白str().encode()
和unicode().decode()
的用途。任何人都可以解释,并可能还纠正我上面遇到的任何其他错误吗?
编辑:
有几个答案提供.encode
对字符串的作用的信息,但似乎没有人知道.decode
对unicode的作用。
答案 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中使用单独的byte
和string
类型,这不再是一个问题。
答案 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
的这些值有意义:
我不确定解码已经解码的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()。
所以编码信息是原始字节,解码信息是原始字节和要引用的字典的名称(但不是字典本身)。