这是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
被替换为无法解码的字节?
编辑:
问题:
协议(比如说)是正在接收的字节。如何查找,字节表示在哪个编码?假设正在从网络接收这些字节。
答案 0 :(得分:2)
你的理解是错误的。 decode
是“从您作为第一个参数传递给unicode
的编码中表示的字节数”; encode
是“从unicode
到您传递的编码中表示的字节作为第一个参数”。
在您的示例中,您给出了一些以UTF-8表示的字节,并告诉Python将它们解释为ASCII,然后构建一个unicode
字符串;鉴于所有> 127字节都不是有效的ASCII,它们被认为是垃圾,因此,正如您使用"replace"
参数请求的那样,它们将替换为Unicode替换字符。