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...
我已经 运行 了解 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 asC2 A0
试试这个:
$ python3 -c "import sys; sys.stdout.buffer.write(b'\x30\xA0\x04\x08')" | xxd
0000000: 30a0 0408 0...