栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

考虑以下代码片段:

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
类型。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/639779.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号