考虑以下代码片段:
import sysfor i in range(128, 256): sys.stdout.write(chr(i))
使用Python 2运行此命令,然后使用以下命令查看结果
hexdump -C:
00000000 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f |................|
等等。不出意外;从
0x80到128个字节
0xff。
对Python 3做同样的事情:
00000000 c2 80 c2 81 c2 82 c2 83 c2 84 c2 85 c2 86 c2 87 |................|...00000070 c2 b8 c2 b9 c2 ba c2 bb c2 bc c2 bd c2 be c2 bf |................|00000080 c3 80 c3 81 c3 82 c3 83 c3 84 c3 85 c3 86 c3 87 |................|...000000f0 c3 b8 c3 b9 c3 ba c3 bb c3 bc c3 bd c3 be c3 bf |................|
总结一下:
- 从
0x80
到的所有内容0xbf
都已0xc2
添加。 - 从
0xc0
到的所有内容都将第0xff
6位设置为零,并且已0xc3
添加。
那么,这是怎么回事?
在Python 2中,字符串为ASCII,并且不进行任何转换。告诉它写在0-127 ASCII范围之外的内容,并说“ okey-
doke!”。并只写那些字节。简单。
在Python 3中,字符串是 Unipre 。写入非ASCII字符时,必须以某种方式对它们进行 编码 。默认编码为UTF-8。
那么,这些值如何用UTF-8编码?
从
0x80到的代码点
0x7ff编码如下:
110vvvvv 10vvvvvv
其中11个
v字符是代码点的位。
从而:
0x80 hex1000 0000 8-bit binary000 1000 0000 11-bit binary00010 000000 divide into vvvvv vvvvvv11000010 10000000 resulting UTF-8 octets in binary0xc2 0x80 resulting UTF-8 octets in hex0xc0 hex1100 0000 8-bit binary000 1100 0000 11-bit binary00011 000000 divide into vvvvv vvvvvv11000011 10000000 resulting UTF-8 octets in binary0xc3 0x80 resulting UTF-8 octets in hex
因此,这就是为什么要获得
c2以前的原因
87。
如何在Python 3中避免所有这些?使用
bytes类型。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)