我一直不确定我是否理解 str/unicode 解码和编码之间的区别。

我知道 str().decode() 当您知道一串字节具有特定的字符编码时,给定该编码名称,它将返回一个 unicode 字符串。

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

但我不明白什么 str().encode()unicode().decode() 是给。谁能解释一下,并可能纠正我上面犯的其他错误?

编辑:

几个答案提供了有关什么的信息 .encode 在一根绳子上做,但似乎没有人知道是什么 .decode 对于 unicode 来说。

有帮助吗?

解决方案

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'

不过你是对的:这两个应用程序中“编码”的模糊用法是......尴尬。再次,与单独 bytestring Python 3 中的类型,这不再是问题。

其他提示

将 unicode 字符串表示为字节串称为 编码. 。使用 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)

当您需要将 unicode 字符串用于 IO 时,通常会对它进行编码,例如通过网络传输它,或将其保存到磁盘文件。

将字节字符串转换为 unicode 字符串称为 解码. 。使用 unicode('...', 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 可能不正确。

一些好的链接:

anUnicode。的编码( '编码')导致的字符串对象,并且可以一个unicode对象上调用

ASTRING。的解码( '编码')导致一个的的unicode 对象,并且可以称为上的绳子,在给定的编码进行编码。


一些更多的解释:

可以创建某些Unicode对象,该对象不具有任何的编码集。它存储被Python在内存的方式与你无关的。您可以搜索它,将它和打电话给你喜欢的任何字符串操作功能。

但总会有这种时候,当你想打印的unicode对象控制台或到一些文本文件。所以,你必须为编码它(例如 - 在UTF-8),你叫编码( 'UTF-8'),你会得到与 '\ü' 内的字符串,这是完美可印刷的。

然后,再次 - 你想要做相反 - 在UTF-8编码的字符串读和把它作为一个统一的,所以\ U360将一个字符,而不是5。然后您解码的字符串(与选定的编码),并得到的unicode类型的品牌新对象。

正如一个侧面说明 - 您可以选择一些色狼编码,像“拉链”,“BASE64”,“腐”,有些人会从字符串转换为字符串,但我认为,最常见的情况是一个涉及UTF-8 / UTF-16和字符串。

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

  • 64位基数
  • 乙二
  • 兹库
  • 十六进制
  • 科普里
  • 罗特13
  • 字符串转义

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

您应该阅读的Python的UnicodeDecodeError - 我误解编码。我在Python的Unicode的理解阅读接受的答案后,更加清晰。

有可用于除冰剂/编码从STR到STR或从Unicode为Unicode几个编码。例如BASE64,六角甚至ROT13。它们中列出的编解码器模块

编辑:

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

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

返回的类型的STR代替的unicode这是在我的意见不幸。但是当你没有做STR和unicode之间的适当加密/解码,这看起来像一个烂摊子呢。

简单的回答是,它们是彼此正好相反。

计算机使用字节来存储和处理信息的非常基本单元,它是没有意义的人眼。

例如,“\ XE4 \ XB8 \ XAD \ XE6 \ X96 \的x87”是两个中国字符的表示,但计算机只知道他们在给定字典来时(意味着打印或存储)它是中国特色寻找,中国字,在这种情况下,它是“UTF-8”的字典,如果你寻找到一个不同的或错误的字典(使用不同的解码方法),将无法正确显示预期的中国字。

在上述情况下,用于计算机的处理来寻找中国字解码()。

和计算机的写入中国到计算机存储器中的过程是编码()。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top