打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
python3编码之美 | nMask's Blog

终是谁使弦断,花落肩头,恍惚迷离

  之前一直在使用python2.x版本,其中的编码问题颇为头疼,根据使用经验以及实验测试,前些日子总结了一些关于python2.x的编码问题,会在本文最后给出地址。本篇主要描述python3中的编码,如果称Python2的编码为殇,那么Python3的编码就应该为美了。

  我在python2编码之殇一文的最后介绍过,想要解决python2中的编码问题,最直接有效的方法就是将所有外部的字符串转变为unicode格式,再在python内部了流转。python3正是在这方面做了很大的优化。
  python3中也有2种编码格式,分别为str与byte,这里的str相当于2中的unicode,byte相当于2中的str。再者python3将python源代码编码从ascii改成了utf-8,从外部接收的编码自动转化成了str(2中的unicode),大大减少产生编码异常的点。与2一样,3中的编码原则就是将外部接收的字符编码成str(unicode字符),输出时再编码成bytes编码。光说没用,我用实验证明。

bytes/str/unicode区别

更新于2017年5月2号

python3的bytes与str

  bytes表示字符的原始8位值,str表示Unicode字符。将unicode字符表示为二进制数据(原始8位值),最常见的编码方式就是UTF-8。python2与3中的unicode字符没有和特定的二进制编码相关联,因此需要使用encode方法。
  在python3中bytes与str是绝对不会等价的,即使字符内容为””,因此在传入字符序列时必须注意其类型。

python2的str与unicode

  str表示字符的原始8位值,unicode表示Unicode字符。
  在python2中,如果str只包含7位ASCII字符(英文字符),那么unicode与str实例类似于同一种类型(等价的),那么在这种情况下,以下几种操作是正常的:

  • 可以用+号连接str与unicode
  • 可以用=与!=来判断str与unicode
  • 可以用’%s’来表示Unicode实例

系统以及源代码编码

3.x已经把源代码编码以及系统编码从ascii都变成了utf-8,避免了中文报错。

1
2
3
4
5
6
>>> import sys
>>> print(sys.getdefaultencoding())
utf-8
>>> print(sys.getfilesystemencoding())
utf-8
>>>

其次,我们可以看到我们定义的a为str(相当于2.x中unicode),而它在windows控制台输出时也没有因为编码问题而报错。

1
2
3
>>> a="你好"
>>>print(a)
你好

字符串编码

1
2
3
4
5
6
7
>>> a="你好"
>>> print(type(a))
<class 'str'>
>>> b=a.encode("utf-8")
>>> print(type(b))
<class 'bytes'>
>>>

我们可以看到,3.x中的str格式类似于2.x中的unicode,而2.x中的str相当于3.x中的bytes.

网页编码


结果:

返回的是bytes格式的,只要decode转化为str就ok了。

文件编码


结果:从文件中读取出来的是str(2.x中的unicode),因此不用转码。

open函数

注意python2中open句柄是str(原始二进制)的,而python3中是str(unicode字符),因此一下代码在python2中正常,在python3中会报错:

1
2
with open("test","w") as w:
w.write("123")

因为python3中,要求传入的值为str类型,而不是bytes类型,open函数自带encoding方法。
解决方法:

1
2
with open("test","wb") as w:
w.write("123")

同理,read函数也是一样,写成rb,就可以兼容2与3了。

传送门

Python2编码之殇
Python2编码之殇续集

转载请说明出处:Python3编码之美|nMask’Blog
本文地址:http://thief.one/2017/04/18/1/

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
梳理Python基本认识基本类型,从零开始,学习Python
第四章 python3 语法基础之字符集编码格式
对Python3编码的整理!!!
Python必学基础概念
python编码问题大终结
python中的编码问题:以ascii和unicode为主线
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服