Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 编码/解码之间的区别是什么?_Python_String_Unicode_Character Encoding_Python 2.x - Fatal编程技术网

Python 编码/解码之间的区别是什么?

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/unicode解码和编码之间的区别

我知道
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'