python - 编码/解码有什么区别?

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

我知道 str().decode() 用于当你有一个你知 Prop 有某种字符编码的字节字符串时,给定编码名称它将返回一个 unicode 字符串。

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

但我不明白 str().encode()unicode().decode() 是干什么用的。任何人都可以解释,并可能纠正我在上面弄错的任何其他内容吗?

编辑:

几个答案提供了关于 .encode 对字符串的作用的信息,但似乎没有人知道 .decode 对 unicode 的作用。

最佳答案

unicode 字符串的 decode 方法实际上根本没有任何应用程序(除非您出于某种原因在 unicode 字符串中有一些非文本数据——见下文)。我认为这主要是出于历史原因。在 Python 3 中它完全消失了。

unicode().decode() 将使用默认 (ascii) 编解码器对 s 执行隐式 encoding。像这样验证:

>>> 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()也是多余的。

但是后一种方法的另一个应用是有用的:有 encodings与字符集无关,因此可以以有意义的方式应用于 8 位字符串:

>>> s.encode('zip')
'x\x9c;\xbc\r\x00\x02>\x01z'

不过,您是对的:对于这两个应用程序,“编码”的模棱两可的用法是……很尴尬。同样,在 Python 3 中使用单独的 bytestring 类型,这不再是问题。

https://stackoverflow.com/questions/447107/

相关文章:

linux - 如何检测网线/连接器的物理连接状态?

python - ValueError : The truth value of an array

linux - 使用 Bash 自动将最后一个命令的输出捕获到变量中?

python - 在 scikit-learn 中将分类器保存到磁盘

linux - 从文件列表中获取输入的 Tar 归档

python - Python SciPy 需要 BLAS 吗?

linux - 如何强制从另一个 SSH session 中分离 screen ?

django - 在 Django 中处理一页上的多个表单的正确方法

Python Infinity - 有什么注意事项吗?

c - 编写程序以处理导致 Linux 上丢失写入的 I/O 错误