开发者社区> 千锋Python讲堂> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Python:一图看懂Python2还是Python3的编码

简介: Python:一图看懂Python2还是Python3的编码
+关注继续查看

无论是Python2还是Python3,都使用unicode作为内存编码,简称内码。保存在python解释器内存中的文本,输出到屏幕、编辑器,或者保存成文件的时候,都要将内码转换成utf8或者gbk等编码格式;同样,python解释器从输入设备接收文本,或者从文件读取文本的时候,都要将utf8或者gbk等编码转换成unicode编码格式。因此,无论是Python2还是Python3,想要在unicode、utf8、gbk等编码格式之间转换的话,下图是通用的:

py

我们之所以会产生困惑,是因为py2和Python3给这些编码格式指定了令人困惑的名字。Python2的字符串有两种类型:unicode类型和str类型。Python2的unicode类型就是unicode编码,Python2的str类型泛指除unicode编码之外的所有编码,包括ascii编码、utf8编码、gbk编码、cp936编码等。Python3的字符串也有两种类型:bytes类型和str类型。Python3的str类型就是unicode编码,Python3的bytes类型泛指除unicode编码之外的所有编码,包括ascii编码、utf8编码、gbk编码、cp936编码等。同样是str类型,在Python2和Python3中完全颠倒了!下图稍微补充了一点内容,更有助于理解编码问题。

接下来,我们实战演练一下。

s = 'abc天圆地方'
type(s)

len(s)

7

s

'abc天圆地方'

print(s)

abc天圆地方

s.encode('unicode-escape')

b'abc\u5929\u5706\u5730\u65b9'
不管是否在字符串前面加了u,只要不在字符串前面使用b,在IDLE中定义的字符串都是unicode编码,也就是py3的,其长度就是字符数量,不是字节数。我们把unicode字符串’abc天圆地方’转成utf8编码:

s_utf8 = s.encode('utf8')
type(s_utf8)

len(s_utf8)

15

s_utf8

b'abc\xe5\xa4\xa9\xe5\x9c\x86\xe5\x9c\xb0\xe6\x96\xb9'

print(s_utf8)

b'abc\xe5\xa4\xa9\xe5\x9c\x86\xe5\x9c\xb0\xe6\x96\xb9'

s_utf8.decode('utf8')

'abc天圆地方'
utf8编码就是bytes类型(字节码),长度就是字节数量。我们把unicode字符串’abc天圆地方’转成gbk编码:

s_gbk= s.encode('gbk')
type(s_gbk)

len(s_gbk)

11

s_gbk

b'abc\xcc\xec\xd4\xb2\xb5\xd8\xb7\xbd'

print(s_gbk)

b'abc\xcc\xec\xd4\xb2\xb5\xd8\xb7\xbd'

s_gbk.decode('s_gbk')

'abc天圆地方'
gbk编码也是bytes类型(字节码),长度也是字节数量。我们再来看看,不同编码的字节码能否连接:

ss = s_utf8 + s_gbk
ss

b'abc\xe5\xa4\xa9\xe5\x9c\x86\xe5\x9c\xb0\xe6\x96\xb9abc\xcc\xec\xd4\xb2\xb5\xd8\xb7\xbd'

ss.decode('utf8')

Traceback (most recent call last):
File "", line 1, in
ss.decode('utf8')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xcc in position 18: invalid continuation byte

ss.decode('gbk')

'abc澶╁渾鍦版柟abc天圆地方'

ss.decode('utf8', 'ignore')

'abc天圆地方abcԲط'

ss.decode('gbk', 'ignore')

'abc澶╁渾鍦版柟abc天圆地方'
看以看出,不同编码的字节码可以连接,但一般不能解码成unicode(字符串),除非使用ignore参数。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Python基础教程之字符串和编码
Python基础教程之字符串和编码
0 0
运营学Python|一文搞定编码环境
运营学Python|一文搞定编码环境
0 0
ASCII编码(Python扩展)
了解ASCII.和他的作用。
0 0
Python编程:chardet模块检测byte字节编码
Python编程:chardet模块检测byte字节编码
0 0
Python爬虫:处理html实体编码
Python爬虫:处理html实体编码
0 0
学习笔记 | PEP8 Python 编码规范
学习笔记 | PEP8 Python 编码规范
0 0
python编码问题、乱码问题
python编码问题、乱码问题
0 0
数据可视化分析除了需要编码的Python,还有更简单的方式吗?
大数据、数据分析的兴起和火爆,也带动了数据可视化的广泛应用。说起数据分析和可视化的关系,就好比你为一堆散乱的拼图写了一份说明,告诉他这个数据是什么样子,代表什么。可以说,数据可视化虽然不是必不可少的,但却是可以加快效率,为报告锦上添花的。今天,说起数据可视化,我们就不得不谈一下数据可视化工具了。主要说到的这个工具也是最近在数据分析圈比较受追捧的一个软件——Python。
0 0
Python 二十三大实践、编码建议和技巧
Python 二十三大实践、编码建议和技巧
0 0
+关注
千锋Python讲堂
Python忠实粉!从业Python已有6年!希望在这里跟大家一起分享我的经验和同伴交流!
文章
问答
文章排行榜
最热
最新
相关电子书
更多
Python系列直播第一讲——Python中的一切皆对象
立即下载
Python 脚本速查手册
立即下载
Python 系列直播——深入Python与日志服务,玩转大规模数据分析处理实战第二讲
立即下载