Python2与Python3关于字符串编码处理的差别总结


Posted in Python onSeptember 07, 2020

0x00 字符的编码

计算机毕竟是西方国家的发明,最开始并没有想到会普及到全世界,只用一个字节中的7位(ASCII)来表示字符对于现在庞大的文字数量来说显然不够,所以先后经历了好几套编码方案,不同国家和地区又有自己的方案,造成了现在诸多的历史遗留问题。

0x01 Python中的字符串

Python有两种不同的字符串,一种存储文本,一种存储字节。对于文本,Python内部采用Unicode存储,而字节字符串显示原始字节序列或者ASCII。

什么叫编码(encode)?

按照字面意思和以往经验,我要把这个文本或字符串用“UTF-8”编码,感觉上应该是对字节数据进行编码然后显示正确的文字。大多数人都是这么想的,可事实呢?

编码的意思是将Unicode字符按照编码规则(如UTF-8)编成字节序列:

Python2与Python3关于字符串编码处理的差别总结

有人此时会问,我用 print 语句打印出来怎么是乱码或者是中文,并不是字节序列。这是因为你调用 print 语句的时候,默认进行了隐式解码,为的是让人类看见友好的字符数据 ,也就是默认的进行了str()包装,想看见背后真正的十六进制数,你需要调用魔术方法 _repr_()

什么叫解码(decode)?

对应的,解码就是将字节序列按照编码规则(如UTF-8)解释成unicode形式。

Python2与Python3关于字符串编码处理的差别总结

这里或许又会有疑问,编码解码都是十六进制,那中文字符咋显示的?
这又要结合你的环境了。看完我上面推荐的文章,你就会明白,Unicode只是一种标准,而具体的编码才是实现方式。有了正确的Unicode编码,仅仅代表你有了正确的英文文献,想翻译成中文,还得再转换一次。而这一次转换,是你的环境帮你完成。举个例子,你打开一个文档,发现是乱码,多半是文本编辑器的解码方式有问题,换个解码规则就好了。

0x02 Python2 和 Python3 之间的区别

Python3 一切都很美好

在Python3当中,文本字符串类型(使用Unicode数据存储)被命名为 str , 字节字符串类型被命名为 bytes 。一般情况下,实例化一个字符串会得到一个 str 对象 :

Python2与Python3关于字符串编码处理的差别总结

所以现在很多人都说,Python3默认是Unicode,也就是这个意思。

如果你想得到bytes,那就在文本之前加上前缀 b , 或者 encode 一下。

Python2与Python3关于字符串编码处理的差别总结

所以,很显然,str 对象有一个encode方法,bytes 对象有一个decode方法。

Python2 相当的操蛋,甚至会误导你

在Python3中的 str 对象在Python2中叫做 unicode ,感觉很通俗对吧?但 bytes 对象在Python2中叫做 str ,对。。就是你平时用的 str , 默认的那个。。。

如果你想得到一个文本字符串,你需要在字符串之前加上前缀 u 或者 decode 一下。

搞笑的还不止这么点,Python2中的 str (字节) 对象,竟然有一个 encode 方法!!!而且你别指望它有什么特殊用处,它就是用来报错的,永远都别使用它!!!

同样的,unicode (文本字符) 对象也有一个用来报错的 decode 方法。

我们尝试一下:

Python2与Python3关于字符串编码处理的差别总结

不知道大家注意到错误信息没有,我们在进行解码,规则是GBK,但它说 无法用 ascii 进行编码 ,这是为什么?

这就是Python2自作聪明为了对一个unicode对象执行解码而进行的隐式编码 ,等于以下代码:

b.encode('ascii').decode('GBK')

这就是为什么很多人说,Python2的编码很操蛋。

0x03 小结

如果你在用2.X,请养成在字符串加上 u 前缀的习惯,统一编码UTF-8,如果windows控制台或者Pycharm控制台依旧出现乱码,那多半是控制台编码不同,改过来就好。

参考书籍 《Python 高级编程》

总结

到此这篇关于Python2与Python3关于字符串编码处理的差别总结的文章就介绍到这了,更多相关Python2与Python3字符串编码处理差别内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python中wx将图标显示在右下角的脚本代码
Mar 08 Python
python调用短信猫控件实现发短信功能实例
Jul 04 Python
如何高效使用Python字典的方法详解
Aug 31 Python
详解K-means算法在Python中的实现
Dec 05 Python
对dataframe数据之间求补集的实例详解
Jan 30 Python
python实现支付宝转账接口
May 07 Python
python绘制双Y轴折线图以及单Y轴双变量柱状图的实例
Jul 08 Python
Python获取命令实时输出-原样彩色输出并返回输出结果的示例
Jul 11 Python
Python 合并多个TXT文件并统计词频的实现
Aug 23 Python
Python实现一个论文下载器的过程
Jan 18 Python
10个顶级Python实用库推荐
Mar 04 Python
python实现的人脸识别打卡系统
May 08 Python
python 装饰器的实际作用有哪些
Sep 07 #Python
通俗讲解python 装饰器
Sep 07 #Python
彻底搞懂python 迭代器和生成器
Sep 07 #Python
python如何设置静态变量
Sep 07 #Python
获取CSDN文章内容并转换为markdown文本的python
Sep 06 #Python
浅谈Python描述数据结构之KMP篇
Sep 06 #Python
详解Python3 定义一个跨越多行的字符串的多种方法
Sep 06 #Python
You might like
PHP isset()与empty()的使用区别详解
2010/08/29 PHP
php的hash算法介绍
2014/02/13 PHP
PHP URL参数获取方式的四种例子
2014/02/28 PHP
php微信开发之关注事件
2018/06/14 PHP
动态为事件添加js代码示例
2009/02/15 Javascript
基于jQuery替换table中的内容并显示进度条的代码
2011/08/02 Javascript
解析js如何获取当前url中的参数值并复制给input
2013/06/23 Javascript
jquery实现可拖动DIV自定义保存到数据的实例
2013/11/20 Javascript
详解javascript的变量与标识符
2016/01/04 Javascript
jQuery实现的分子运动小球碰撞效果
2016/01/27 Javascript
JavaScript中的跨浏览器事件操作的基本方法整理
2016/05/20 Javascript
jquery.tableSort.js表格排序插件使用方法详解
2020/08/12 Javascript
babel基本使用详解
2017/02/17 Javascript
React Native 自定义下拉刷新上拉加载的列表的示例
2018/03/01 Javascript
解决vue单页使用keep-alive页面返回不刷新的问题
2018/03/13 Javascript
JavaScript生成指定范围的时间列表
2018/03/19 Javascript
angular2实现统一的http请求头方法
2018/08/13 Javascript
vue拖拽组件 vuedraggable API options实现盒子之间相互拖拽排序
2019/07/08 Javascript
[51:00]Secret vs VGJ.S 2018国际邀请赛淘汰赛BO3 第一场 8.24
2018/08/25 DOTA
Python实现根据指定端口探测服务器/模块部署的方法
2014/08/25 Python
python 远程统计文件代码分享
2015/05/14 Python
通过数据库向Django模型添加字段的示例
2015/07/21 Python
Python Pandas找到缺失值的位置方法
2018/04/12 Python
python 去除txt文本中的空格、数字、特定字母等方法
2018/07/24 Python
Python实现ElGamal加密算法的示例代码
2020/06/19 Python
PyCharm最新激活码PyCharm2020.2.3有效
2020/11/18 Python
银行求职信个人范文
2013/12/16 职场文书
安全责任书模板
2014/07/22 职场文书
做人民满意的公务员活动方案
2014/08/25 职场文书
个人向公司借款协议书
2014/10/09 职场文书
冲出亚马逊观后感
2015/06/03 职场文书
中学图书馆工作总结
2015/08/11 职场文书
创业开店,这样方式更合理
2019/08/26 职场文书
导游词之贵州百里杜鹃
2019/10/29 职场文书
Nginx下SSL证书安装部署步骤介绍
2021/12/06 Servers
浅谈为什么我的 z-index 又不生效了
2022/07/15 HTML / CSS