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实现的数据结构与算法之链表详解
Apr 22 Python
python从入门到精通(DAY 1)
Dec 20 Python
python实现决策树C4.5算法详解(在ID3基础上改进)
May 31 Python
便捷提取python导入包的属性方法
Oct 15 Python
在Python中使用defaultdict初始化字典以及应用方法
Oct 31 Python
pygame游戏之旅 计算游戏中躲过的障碍数量
Nov 20 Python
Python随机生成身份证号码及校验功能
Dec 04 Python
python将print输出的信息保留到日志文件中
Sep 27 Python
python自动分箱,计算woe,iv的实例代码
Nov 22 Python
Python实现查找数据库最接近的数据
Jun 08 Python
Python用Jira库来操作Jira
Dec 28 Python
利用Python读取微信朋友圈的多种方法总结
Aug 23 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中配置文件操作 如config.php文件的读取修改等操作
2012/07/07 PHP
php模拟ping命令(php exec函数的使用方法)
2013/10/25 PHP
PHP递归删除目录几个代码实例
2014/04/21 PHP
ThinkPHP表单数据智能写入create方法实例分析
2015/09/27 PHP
thinkPHP5.0框架API优化后的友好性分析
2017/03/17 PHP
php提交表单时保留多个空格及换行的文本样式的方法
2017/06/20 PHP
Laravel Validator 实现两个或多个字段联合索引唯一
2019/05/08 PHP
PHP时间类完整代码实例
2021/02/26 PHP
返回上一页并自动刷新的JavaScript代码
2014/02/19 Javascript
jQuery判断元素是否存在的可靠方法
2014/05/06 Javascript
JavaScript中的this关键字使用详解
2015/08/14 Javascript
用jQuery实现可输入多选下拉组合框实例代码
2017/01/18 Javascript
angular.js4使用 RxJS 处理多个 Http 请求
2017/09/23 Javascript
微信小程序基于slider组件动态修改标签透明度的方法示例
2017/12/04 Javascript
JQuery搜索框自动补全(模糊匹配)功能实现示例
2019/01/08 jQuery
jQuery zTree插件快速实现目录树
2019/08/16 jQuery
vue+elementUI实现图片上传功能
2019/08/20 Javascript
Vue js with语句原理及用法解析
2020/09/03 Javascript
[04:21]狐狸妈带你到现场 DOTA2 TI中国区预选赛线下赛路线指引
2014/05/22 DOTA
[01:39:42]Fnatic vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
[01:23:24]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第三场 2月7日
2021/03/11 DOTA
Python中unittest用法实例
2014/09/25 Python
python提示No module named images的解决方法
2014/09/29 Python
python 把文件中的每一行以数组的元素放入数组中的方法
2018/04/29 Python
python爬虫之自制英汉字典
2019/06/24 Python
python logging设置level失败的解决方法
2020/02/19 Python
使用pycharm和pylint检查python代码规范操作
2020/06/09 Python
python实现暗通道去雾算法的示例
2020/09/27 Python
使用Python爬虫爬取小红书完完整整的全过程
2021/01/19 Python
优秀党员先进材料
2014/12/18 职场文书
三八红旗手事迹材料
2014/12/26 职场文书
新郎父母婚礼答谢词
2015/09/29 职场文书
亲情作文之母爱
2019/09/25 职场文书
Mysql官方性能测试工具mysqlslap的使用简介
2021/05/21 MySQL
python 判断文件或文件夹是否存在
2022/03/18 Python
MySQL存储过程及语法详解
2022/08/05 MySQL