问题:编码/解码有什么区别?
我从来不确定我了解str / unicode解码和编码之间的区别。
我知道这str().decode()
是针对当您有一个字节字符串,并且您知道该字符串具有某种字符编码时,给定该编码名称,它将返回一个unicode字符串。
我知道unicode().encode()
根据给定的编码名称将Unicode字符转换为字节字符串。
但我不明白是什么str().encode()
以及unicode().decode()
是。有人可以解释,也可以更正我在上面遇到的其他错误吗?
编辑:
有几个答案给出了.encode
有关字符串处理内容的信息,但似乎没人知道.decode
Unicode的处理内容。
回答 0
decode
Unicode字符串的方法实际上根本没有任何应用程序(除非出于某种原因在Unicode字符串中包含一些非文本数据,请参见下文)。我认为主要是出于历史原因。在Python 3中,它完全消失了。
unicode().decode()
将执行隐式编码的s
使用默认(ASCII)编解码器。像这样验证:
>>> 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位字符串:
>>> s.encode('zip')
'x\x9c;\xbc\r\x00\x02>\x01z'
但是,您是对的:这两个应用程序对“编码”的模棱两可用法令人生厌。同样,在Python 3中使用单独byte
和string
类型,这不再是问题。
回答 1
将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'编解码器无法编码位置0-5处的字符: 序数不在范围内(128)
通常,在需要将unicode字符串用于IO(例如,通过网络传输它或将其保存到磁盘文件)时,通常会对其进行编码。
将字节字符串转换为unicode字符串称为解码。使用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'
通常,每当您从网络或磁盘文件接收到字符串数据时,就对字节字符串进行解码。
我相信python 3的unicode处理方式有所变化,因此以上内容可能不适用于python 3。
一些好的链接:
回答 2
Unicode。encode(’encoding’)产生一个字符串对象,并且可以在unicode对象上调用
aString。解码(“编码”)产生一个unicode对象,可以在以给定编码方式编码的字符串上调用。
一些更多的解释:
您可以创建一些未设置任何编码的unicode对象。Python将其存储在内存中的方式与您无关。您可以对其进行搜索,拆分并调用您喜欢的任何字符串操作函数。
但是有时候,您想将unicode对象打印为控制台或某些文本文件。因此,您必须对其进行编码(例如-在UTF-8中),调用encode(’utf-8’),然后会得到一个带有’\ u <someNumber>’的字符串,该字符串可完美打印。
然后,再次(您想做相反的事情)读取以UTF-8编码的字符串并将其视为Unicode,因此\ u360将是一个字符,而不是5。然后解码一个字符串(使用选定的编码),然后获取unicode类型的全新对象。
恰如其分-您可以选择一些变态编码,例如’zip’,’base64’,’rot’,其中一些会在字符串之间转换,但是我认为最常见的情况是涉及UTF-8 / UTF-16和字符串。
回答 3
mybytestring.encode(somecodec)对于以下值有意义somecodec
:
- base64
- bz2
- zlib
- 十六进制
- 夸普里
- 腐烂13
- string_escape
- u
我不确定解码已解码的unicode文本适合什么。尝试使用任何编码似乎总是先尝试使用系统的默认编码进行编码。
回答 4
有几种编码可用于从str到str或从unicode到unicode解码/编码。例如base64,hex甚至rot13。它们在编解码器模块中列出。
编辑:
Unicode字符串上的解码消息可以撤消相应的编码操作:
In [1]: u'0a'.decode('hex')
Out[1]: '\n'
返回的类型是str而不是unicode,我认为这很不幸。但是,当您没有在str和unicode之间进行适当的编码/解码时,无论如何这看起来都是一团糟。
回答 5
简单的答案是它们彼此完全相反。
计算机使用字节的最基本单位来存储和处理信息。这对人眼毫无意义。
例如,\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\中文单词,在这种情况下,它是“ utf-8”字典,如果您查看其他或错误的字典(使用其他解码方法),它将无法正确显示预期的中文单词。
在上述情况下,计算机查找中文单词的过程为decode()
。
并且计算机将中文写入计算机存储器的过程是encode()
。
因此,编码信息是原始字节,解码信息是原始字节和要引用的字典的名称(但不是字典本身)。