Python3 打印十六进制值时添加额外的字节

Python3 adds extra byte when printing hex values

我已经 运行 了解 Python2 和 Python3 之间的奇怪区别。当用 Python3 打印时,打印相同的字符列表会产生一个额外的字节 C2。我会期待同样的行为。 Python2 表现如我所料。我在这里错过了什么?

$ python3 -c "print('\x30\xA0\x04\x08')" | xxd
0000000: 30c2 a004 080a     
$ python2 -c "print('\x30\xA0\x04\x08')" | xxd
0000000: 30a0 0408 0a  

Python 3个字符串是unicode,在你的平台上unicode是使用UTF-8编码打印的。 unicode字符U+00A0的UTF-8编码是0xC2 0xA0,这就是你看到的。

Python 2个字符串是bytestrings,所以它们是准确输出的。

在 Python 3 中,所有字符串文字都是 unicode。

\A0转换为UTF-8是no-break space:

U+00A0 no-break space (HTML   ·  ) Can be encoded in UTF-8 as C2 A0

试试这个:

$ python3 -c "import sys; sys.stdout.buffer.write(b'\x30\xA0\x04\x08')" | xxd
0000000: 30a0 0408                                0...