为什么python2和python3中的print输出使用相同的字符串不同?

lzutao

在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伊斯兰教所说)

那么如何在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  |................|

等等。不出意外;0x80128个字节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到的所有内容都将第0xff6位设置为零,并且已0xc3添加。

那么,这是怎么回事?

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

在Python 3中,字符串是Unicode写入非ASCII字符时,必须以某种方式对它们进行编码默认编码为UTF-8。

那么,这些值如何用UTF-8编码?

0x80到的代码点0x7ff编码如下:

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

因此,这就是为什么要获得c2以前的原因87

如何在Python 3中避免所有这些?使用bytes类型。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么在python2和python3中包含路径不同?

来自分类Dev

为什么Unicode字符串在Python 2和3中占用的内存不同?

来自分类Dev

为什么Python2和Python3的行为不同

来自分类Dev

Python2 中的 Python3 f 字符串替代

来自分类Dev

Python2中的Python3 f字符串替代

来自分类Dev

Python:在python2和python3中以相同的方式使用unicode文字

来自分类Dev

为什么内置函数`any(b'\ x00')`在python2和python3之间的行为不同?

来自分类Python

为什么不同的字符串在Python中具有相同的ID?

来自分类Dev

F字符串和将函数输出写入python3中的文件

来自分类Dev

在python3中,为什么“输入”被解释为字符串?

来自分类Dev

使用python2和python3的相同代码进行编码+加密+填充问题

来自分类Dev

Python2和Python3之间的字符编码

来自分类Dev

python3中的JSON字符串和.format()

来自分类Dev

Ansible json_query在python3和python2中的不同结果

来自分类Dev

猴子修补运算符重载在Python2和Python3中的行为不同

来自分类Dev

在Python2和Python3中编写不同的十六进制值

来自分类Dev

pyaudio 在 python2 和 python3 中播放不同的音调

来自分类Dev

为什么要通过python2运行guake,但错误中存在“ python3”?

来自分类Dev

python中的输出与python3不同(相同的脚本)

来自分类Dev

为什么使用 concat 函数创建的 2 个字符串和相同的字符串具有不同的对象引用?

来自分类Dev

在python2和python3中映射

来自分类Dev

我可以像在python2中一样在python3中使pprint不拆分字符串吗?

来自分类Dev

为什么相同字符串的java String.length与python len()给出不同的结果

来自分类Dev

Python3 print()与Python2 print

来自分类Dev

Python3 print()与Python2 print

来自分类Dev

当我使用networkx.draw绘制网络时,python2和python3使用相同的程序,但是python2无法正确绘制

来自分类Dev

为什么我在 PHP 中使用 strlen() 函数获得相同字符串的两个不同输出?

来自分类Dev

为什么在带Python3的SQLAlchemy中使用BINARY会导致TypeError:“不带编码的字符串参数”

来自分类Dev

为什么 C++ 和 Python 中的相同代码生成不同的输出?

Related 相关文章

  1. 1

    为什么在python2和python3中包含路径不同?

  2. 2

    为什么Unicode字符串在Python 2和3中占用的内存不同?

  3. 3

    为什么Python2和Python3的行为不同

  4. 4

    Python2 中的 Python3 f 字符串替代

  5. 5

    Python2中的Python3 f字符串替代

  6. 6

    Python:在python2和python3中以相同的方式使用unicode文字

  7. 7

    为什么内置函数`any(b'\ x00')`在python2和python3之间的行为不同?

  8. 8

    为什么不同的字符串在Python中具有相同的ID?

  9. 9

    F字符串和将函数输出写入python3中的文件

  10. 10

    在python3中,为什么“输入”被解释为字符串?

  11. 11

    使用python2和python3的相同代码进行编码+加密+填充问题

  12. 12

    Python2和Python3之间的字符编码

  13. 13

    python3中的JSON字符串和.format()

  14. 14

    Ansible json_query在python3和python2中的不同结果

  15. 15

    猴子修补运算符重载在Python2和Python3中的行为不同

  16. 16

    在Python2和Python3中编写不同的十六进制值

  17. 17

    pyaudio 在 python2 和 python3 中播放不同的音调

  18. 18

    为什么要通过python2运行guake,但错误中存在“ python3”?

  19. 19

    python中的输出与python3不同(相同的脚本)

  20. 20

    为什么使用 concat 函数创建的 2 个字符串和相同的字符串具有不同的对象引用?

  21. 21

    在python2和python3中映射

  22. 22

    我可以像在python2中一样在python3中使pprint不拆分字符串吗?

  23. 23

    为什么相同字符串的java String.length与python len()给出不同的结果

  24. 24

    Python3 print()与Python2 print

  25. 25

    Python3 print()与Python2 print

  26. 26

    当我使用networkx.draw绘制网络时,python2和python3使用相同的程序,但是python2无法正确绘制

  27. 27

    为什么我在 PHP 中使用 strlen() 函数获得相同字符串的两个不同输出?

  28. 28

    为什么在带Python3的SQLAlchemy中使用BINARY会导致TypeError:“不带编码的字符串参数”

  29. 29

    为什么 C++ 和 Python 中的相同代码生成不同的输出?

热门标签

归档