当前位置: 首页 > 面试题库 >

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

巢星纬
2023-03-14
问题内容

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

等等。不出意外;从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到的所有内容都将第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类型。



 类似资料:
  • 本文向大家介绍Python2和Python3中print的用法示例总结,包括了Python2和Python3中print的用法示例总结的使用技巧和注意事项,需要的朋友参考一下 前言 最近在学习python,对于python的print一直很恼火,老是不按照预期输出。在python2中print是一种输出语句,和if语句,while语句一样的东西,在python3中为了填补python2的各种坑,将

  • 我正在使用带有Spring Security的BCryptPasswordEncoder。我的期望是,对于相同的输入,我总是得到相同的输出。但是对于相同的输入,我得到不同的输出。您可以使用下面的代码片段对其进行测试: 输出:$2A$10$CYLM.QOXPEAZCZHJ3OXRLU9SLKB61LHYWW5QJ4QKVHEMHAXZ5QCPI 输出2:$2A$10$kevyx9yjj0f1x3wl

  • 问题内容: 我正在使用具有Spring安全性的BCryptPasswordEncoder。我的期望是,对于相同的输入,我将始终获得相同的输出。但是对于相同的输入,我得到不同的输出。您可以使用以下代码段对其进行测试: 输出:$ 2a $ 10 $ cYLM.qoXpeAzcZhJ3oXRLu9Slkb61LHyWW5qJ4QKvHEMhaxZ5qCPi 输出2:$ 2a $ 10 $ KEvYX9y

  • 本文向大家介绍python2和python3的输入和输出区别介绍,包括了python2和python3的输入和输出区别介绍的使用技巧和注意事项,需要的朋友参考一下 Python3 输入和输出 输出格式美化 Python两种输出值的方式: 表达式语句和 print() 函数。 第三种方式是使用文件对象的 write() 方法,标准输出文件可以用 sys.stdout 引用。 如果你希望输出的形式更加

  • 本文向大家介绍python2 与python3的print区别小结,包括了python2 与python3的print区别小结的使用技巧和注意事项,需要的朋友参考一下 在Python2和Python3中都提供print()方法来打印信息,但两个版本间的print稍微有差异 主要体现在以下几个方面: 1.python3中print是一个内置函数,有多个参数,而python2中print是一个语法结构

  • 问题内容: 我知道问题的标题不是很清楚,对此感到抱歉,不知道如何提出。我有一个非常基本的Java实现问题,我想着重于应用程序性能,但是它也涉及Java中的String创建模式。 我了解Java中字符串的不变性概念。我不确定的是,我在某处读到以下内容不会创建两个不同的String对象: 我想知道Java是怎么做到的?它实际上是否在程序存储器中寻找一个String值并检查其是否存在,如果不存在则创建一