python - 为什么同样的字符串在python2和python3中print的输出不同?

标签 python unicode utf-8

在 python2 中:

$ python2 -c 'print "\x08\x04\x87\x18"' | hexdump -C
00000000  08 04 87 18 0a                                    |.....|
00000005

在 python3 中:

$ python3 -c 'print("\x08\x04\x87\x18")' | hexdump -C
00000000  08 04 c2 87 18 0a                                 |......|
00000006

为什么这里有字节"\xc2"

编辑:

我认为当字符串有非ascii字符时,python3会将字节“\xc2”附加到字符串中。 (正如@Ashraful Islam 所说)

那么在 python3 中如何避免这种情况呢?

最佳答案

考虑以下代码片段:

import sys
for 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  |................|

等等。没有惊喜;从 0x800xff 共 128 个字节。

对 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  |................|

总结一下:

  • 0x800xbf 的所有内容都预先添加了 0xc2
  • 0xc00xff 的所有内容都将第 6 位设置为零,并在前面添加了 0xc3

那么,这是怎么回事?

在 Python 2 中,字符串是 ASCII 并且不进行任何转换。告诉它 写入 0-127 ASCII 范围之外的内容,它会显示“okey-doke!”和 只是写入这些字节。简单。

在 Python 3 中,字符串是 Unicode。当非 ASCII 字符为 书面的,它们必须以某种方式编码。默认编码是 UTF-8。

那么,这些值是如何以 UTF-8 编码的?

0x800x7ff的代码点编码如下:

110vvvvv 10vvvvvv

其中 11 个 v 字符是代码点的位。

因此:

0x80                 hex
1000 0000            8-bit binary
000 1000 0000        11-bit binary
00010 000000         divide into vvvvv vvvvvv
11000010 10000000    resulting UTF-8 octets in binary
0xc2 0x80            resulting UTF-8 octets in hex

0xc0                 hex
1100 0000            8-bit binary
000 1100 0000        11-bit binary
00011 000000         divide into vvvvv vvvvvv
11000011 10000000    resulting UTF-8 octets in binary
0xc3 0x80            resulting UTF-8 octets in hex

这就是为什么您会在 87 之前获得 c2

如何在 Python 3 中避免这一切?使用 bytes 类型。

关于python - 为什么同样的字符串在python2和python3中print的输出不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61207044/

相关文章:

java - 读取 .json 文件 - BOM 问题?

file - Nginx:静态文件编码 utf8 字符导致 Ã

python - Matplotlib中使用LineCollection时是否可以设置透明度?

python - 为什么截断不能正确默认为文件的当前位置?

HTTPie/cURL 在 Windows 上不显示西里尔字符

java - 使用 Java URL 解析带有 unicode 字符的维基百科 url 时出错

python - 无法在 python IDE (Mac OS X) 中输入 unicode

python - 使用 'expect' 方法捕获 Python 异常?

python - python中的3d sobel算法?

unicode - TeXShop 的 UTF-8 设置已损坏