一图看懂 Python 2 \/ Python 3 编码 | CSDN 博文精选
2019-10-31 18:48
1316 查看
作者 | 天元浪子
我们之所以会产生困惑,是因为PY2和PY3给这些编码格式指定了令人困惑的名字。PY2的字符串有两种类型:Unicode类型和str类型。PY2的Unicode类型就是Unicode编码,PY2的str类型泛指除Unicode编码之外的所有编码,包括ASCII编码、UTF8编码、GBK编码、cp936编码等。PY3的字符串也有两种类型:bytes类型和str类型。PY3的str类型就是Unicode编码,PY3的bytes类型泛指除unicode编码之外的所有编码,包括ASCII编码、UTF8编码、GBK编码、CP936编码等。同样是str类型,在PY2和PY3中完全颠倒了!下图稍微补充了一点内容,更有助于理解编码问题。
接下来,我们实战演练一下。
>>> s = 'abc天圆地方'
>>> type(s)
<class 'str'>
>>> len(s)
7
>>> s
'abc天圆地方'
>>> print(s)
abc天圆地方
>>> s.encode('unicode-escape')
b'abc\\u5929\\u5706\\u5730\\u65b9'
>>> s_utf8 = s.encode('utf8')
>>> type(s_utf8)
<class 'bytes'>
>>> 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)
<class 'bytes'>
>>> 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 "<pyshell#64>", line 1, in <module>
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参数。
【END】
热 文 推 荐
☞抖音回应视频泄露:草稿不会上传后台;苹果开卖5000元印度版iPhone XR;Jboot 2.2.5发布|极客头条
☞“Jupyter的杀手”:Netflix发布新开发工具Polynote
点击阅读原文参与问卷,好礼送不停!
相关文章推荐
- 一图看懂 py2\/ py3 编码 | CSDN 博文精选
- 给 Python 开发者的四条忠告!| CSDN 博文精选
- 给 Python 开发者的四条忠告!| CSDN 博文精选
- 一行 Python 代码能实现什么丧心病狂的功能? | CSDN博文精选
- CSDN博文精选:最受欢迎的系列专栏博客推荐
- 何为量子计算机? | CSDN 博文精选
- Facebook 发布全新 JavaScript 引擎:Hermes! | CSDN博文精选
- Python3 爬虫(五) -- 单线程爬取某人CSDN全部博文
- 为什么我现在不建议你买 5G 手机?|CSDN博文精选
- 从 Android 6.0 源码的角度剖析 Binder 工作原理 | CSDN 博文精选
- 为什么我现在不建议你买 5G 手机?|CSDN博文精选
- CSDN博文精选:Android系列开发博客资源汇总
- 直接拿来用!Vue.js 第三方常用插件盘点 | CSDN 博文精选
- python抓取CSDN博客首页的所有博文,对标题分词存入mongodb中
- 万字长文详解 Go 程序是怎样跑起来的?| CSDN 博文精选
- 贝塞尔曲线之爱心点赞代码全解析!| CSDN 博文精选
- CSDN博文精选:Android系列开发博客资源汇总
- Spring Boot 2.2 正式发布,大幅性能提升 Java 13 支持 | CSDN 博文精选
- 300 秒搞定第一超算 1 万年的计算量,量子霸权时代已来? | CSDN 博文精选
- Python中文编码的相关博文