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

Kai*_*Kai 5 python python-2.x python-3.x

我遇到了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  
Run Code Online (Sandbox Code Playgroud)

int*_*jay 7

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

Python 2字符串是字节串,因此它们是完全输出的.


war*_*iuc 6

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

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

U+00A0 无中断空间(HTML   ·  )可以用UTF-8编码为C2 A0

试试这个:

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