编码/解码有什么区别?
-
22-07-2019 - |
题
我一直不确定我是否理解 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'
不过你是对的:这两个应用程序中“编码”的模糊用法是......尴尬。再次,与单独 byte
和 string
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”的字典,如果你寻找到一个不同的或错误的字典(使用不同的解码方法),将无法正确显示预期的中国字。
在上述情况下,用于计算机的处理来寻找中国字解码()。
和计算机的写入中国到计算机存储器中的过程是编码()。
所以编码信息是原始字节,并且将解码的信息是原始字节和字典的名称来引用(但不是字典本身)。