解码 - 从字节到任何

时间:2017-06-03 19:05:34

标签: python python-2.7 unicode

这是Python 2

我的理解是,

decode 是将字节解码为任何东西(ascii / codepoint / utf-8 /等等。)

encode 是关于将 unicode代码点编码为任何内容(bytes / ascii / utf-8 /...)

从以下代码中

>>> myUtf8
'Hi \xe2\x84\x99\xc6\xb4\xe2\x98\x82\xe2\x84\x8c\xc3\xb8\xe1\xbc\xa4'
>>> myUtf8.decode("ascii", "replace")
u'Hi \ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd'
>>> myUtf8.decode('utf-16')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/encodings/utf_16.py", line 16, in decode
    return codecs.utf_16_decode(input, errors, True)
UnicodeDecodeError: 'utf16' codec can't decode byte 0xa4 in position 18: truncated data

问题

为什么代码点\ufffd被替换为无法解码的字节?

编辑:

问题:

协议(比如说)是正在接收的字节。如何查找,字节表示在哪个编码?假设正在从网络接收这些字节。

1 个答案:

答案 0 :(得分:2)

你的理解是错误的。 decode是“从您作为第一个参数传递给unicode的编码中表示的字节数”; encode是“从unicode到您传递的编码中表示的字节作为第一个参数”。

在您的示例中,您给出了一些以UTF-8表示的字节,并告诉Python将它们解释为ASCII,然后构建一个unicode字符串;鉴于所有> 127字节都不是有效的ASCII,它们被认为是垃圾,因此,正如您使用"replace"参数请求的那样,它们将替换为Unicode替换字符。