Python 编码/解码之间的区别是什么?
我从来都不知道我是否理解str/unicode解码和编码之间的区别 我知道Python 编码/解码之间的区别是什么?,python,string,unicode,character-encoding,python-2.x,Python,String,Unicode,Character Encoding,Python 2.x,我从来都不知道我是否理解str/unicode解码和编码之间的区别 我知道str().decode()用于当您有一个字节字符串,并且您知道该字符串具有特定的字符编码时,给定该编码名称,它将返回一个unicode字符串 我知道unicode().encode()根据给定的编码名称将unicode字符转换为一个字节字符串 但是我不明白str().encode()和unicode().decode()是做什么的。有人能解释一下,也许还能纠正我上面犯的任何错误吗 编辑: 有几个答案给出了.encode对
str().decode()
用于当您有一个字节字符串,并且您知道该字符串具有特定的字符编码时,给定该编码名称,它将返回一个unicode字符串
我知道unicode().encode()
根据给定的编码名称将unicode字符转换为一个字节字符串
但是我不明白str().encode()
和unicode().decode()
是做什么的。有人能解释一下,也许还能纠正我上面犯的任何错误吗
编辑:
有几个答案给出了
.encode
对字符串做什么的信息,但似乎没有人知道.decode
对unicode做什么。有一些编码可以用于从str到str或从unicode到unicode的反编码。例如base64、hex甚至rot13。它们列在列表中
编辑:
unicode字符串上的解码消息可以撤消相应的编码操作:
In [1]: u'0a'.decode('hex')
Out[1]: '\n'
返回的类型是str而不是unicode,这在我看来是不幸的。但是,如果您没有在str和unicode之间执行正确的en-/decode,这看起来还是一团糟。mybytestring.encode(somecodec)对于somecodec的这些值很有意义:
- base64
- bz2
- 兹利布
- 六角形
- 库普里
- rot13
- 串级逃逸
- uu
我不确定解码已经解码的unicode文本有什么好处。尝试任何编码似乎总是首先尝试使用系统的默认编码进行编码。将unicode字符串表示为字节字符串称为编码。使用u'…'。编码(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)
>>> 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'
通常,每当从网络或磁盘文件接收字符串数据时,都会对字节字符串进行解码
我相信Python3中的unicode处理有一些变化,因此上述内容对于Python3可能是不正确的
一些好的链接:
unicode字符串的解码
方法实际上根本没有任何应用程序(除非出于某种原因,unicode字符串中有一些非文本数据,请参见下文)。我认为这主要是因为历史原因。在Python3中,它完全消失了
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()
也是多余的
但是后一种方法的另一个应用非常有用:有一些与字符集无关,因此可以有意义地应用于8位字符串:
>>> s.encode('zip')
'x\x9c;\xbc\r\x00\x02>\x01z'
不过,您是对的:对于这两个应用程序,“编码”的模糊用法是。。。阿卡德。同样,在Python 3中使用单独的字节
和字符串
类型,这不再是一个问题。anUnicode。encode('encoding')产生字符串对象,可以在unicode对象上调用
aString.decode(“编码”)生成一个unicode对象,可以对字符串进行调用,并以给定的编码进行编码
还有一些解释:
您可以创建一些没有任何编码集的unicode对象。Python在内存中存储它的方式与您无关。您可以搜索它、拆分它并调用任何您喜欢的字符串操作函数
但总有一天,您会希望将unicode对象打印到控制台或某个文本文件中。因此,您必须对它进行编码(例如,在UTF-8中),调用encode('UTF-8'),得到一个内部带有“\u”的字符串,该字符串完全可以打印
然后,同样-您希望执行相反的操作-读取UTF-8编码的字符串并将其视为Unicode,因此\u360将是一个字符,而不是5个字符。然后对字符串进行解码(使用选定的编码)并获得unicode类型的全新对象
作为旁注-您可以选择一些变态编码,如“zip”、“base64”、“rot”,其中一些会从字符串转换为字符串,但我相信最常见的情况是涉及UTF-8/UTF-16和字符串的情况。简单的答案是它们彼此完全相反
计算机使用最基本的字节单位来存储和处理信息;这对人的眼睛来说毫无意义
例如,“\xe4\xb8\xad\xe6\x96\x87”是两个汉字的表示形式,但计算机只有在给它们一本字典查找该汉字时才知道(意思是打印或存储),在这种情况下,它是一本“utf-8”字典,如果你查到不同的或错误的字典(使用不同的解码方法),它将无法正确地显示你想要的中文单词
在上述情况下,计算机查找中文单词的过程是decode()
计算机将中文写入计算机内存的过程是encode()
因此,编码信息是原始字节,解码信息是原始字节和要引用的词典名称(但不是词典本身)。-1:解码方法未应用于unicode对象。相反,在解码操作开始之前,unicode对象被编码为“ascii”bytestring。为了证明这个断言,请尝试u'ã'。解码('hex')-这会产生UnicodeEncodeError@nosklo你说得对。我真正的意思是unicode对象有一个decode()方法,这样您也可以对它们应用非字符编码编解码器。在Python<3中,整个非字符编码业务使这个接口变得一团糟。您没有回答OP的问题。OP想知道str.encode()和unicode.decode()的作用。你刚才重复了我说的话
>>> s.encode('zip')
'x\x9c;\xbc\r\x00\x02>\x01z'