Python3如何解决字符编码问题详解


Posted in Python onApril 23, 2017

编码

因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理。最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255(二进制11111111=十进制255),如果要表示更大的整数,就必须用更多的字节。比如两个字节可以表示的最大整数是65535,4个字节可以表示的最大整数是4294967295。

由于计算机是美国人发明的,因此,最早只有127个字母被编码到计算机里,也就是大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码,比如大写字母A的编码是65,小写字母z的编码是122。

Python3字符编码

Python3 最重要的一项改进之一就是解决了 Python2 中字符串与字符编码遗留下来的这个大坑。

Python2 字符串设计上的一些缺陷:

  • 使用 ASCII 码作为默认编码方式,对中文处理很不友好。
  • 把字符串的牵强地分为 unicode 和 str 两种类型,误导开发者

当然这并不算 Bug,只要处理的时候多留心也可以避免这些坑。但在 Python3 两个问题都很好的解决了。

首先,Python3 把系统默认编码设置为 UTF-8

>>> import sys
>>> sys.getdefaultencoding()
'utf-8'
>>>

然后,文本字符和二进制数据区分得更清晰,分别用 str 和 bytes 表示。文本字符全部用 str 类型表示,str 能表示 Unicode 字符集中所有字符,而二进制字节数据用一种全新的数据类型,用 bytes 来表示。

str

>>> a = "a"
>>> a
'a'
>>> type(a)
<class 'str'>

>>> b = "禅"
>>> b
'禅'
>>> type(b)
<class 'str'>

bytes

Python3 中,在字符引号前加‘b',明确表示这是一个 bytes 类型的对象,实际上它就是一组二进制字节序列组成的数据,bytes 类型可以是 ASCII范围内的字符和其它十六进制形式的字符数据,但不能用中文等非ASCII字符表示。

>>> c = b'a'
>>> c
b'a'
>>> type(c)
<class 'bytes'>

>>> d = b'\xe7\xa6\x85'
>>> d
b'\xe7\xa6\x85'
>>> type(d)
<class 'bytes'>
>>>

>>> e = b'禅'
 File "<stdin>", line 1
SyntaxError: bytes can only contain ASCII literal characters.

bytes 类型提供的操作和 str 一样,支持分片、索引、基本数值运算等操作。但是 str 与 bytes 类型的数据不能执行 + 操作,尽管在py2中是可行的。

>>> b"a"+b"c"
b'ac'
>>> b"a"*2
b'aa'
>>> b"abcdef\xd6"[1:]
b'bcdef\xd6'
>>> b"abcdef\xd6"[-1]
214

>>> b"a" + "b"
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
TypeError: can't concat bytes to str

python2 与 python3 字节与字符的对应关系

python2 python3 表现 转换 作用
str bytes 字节 encode 存储
unicode str 字符 decode 显示

encode 与 decode

str 与 bytes 之间的转换可以用 encode 和从decode 方法。

Python3如何解决字符编码问题详解

encode 负责字符到字节的编码转换。默认使用 UTF-8 编码准换。

>>> s = "Python之禅"
>>> s.encode()
b'Python\xe4\xb9\x8b\xe7\xa6\x85'
>>> s.encode("gbk")
b'Python\xd6\xae\xec\xf8'

decode 负责字节到字符的解码转换,通用使用 UTF-8 编码格式进行转换。

>>> b'Python\xe4\xb9\x8b\xe7\xa6\x85'.decode()
'Python之禅'
>>> b'Python\xd6\xae\xec\xf8'.decode("gbk")
'Python之禅'

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Python 相关文章推荐
Python装饰器用法示例小结
Feb 11 Python
python爬虫之xpath的基本使用详解
Apr 18 Python
numpy 对矩阵中Nan的处理:采用平均值的方法
Oct 30 Python
python 获取utc时间转化为本地时间的方法
Dec 31 Python
python获取地震信息 微信实时推送
Jun 18 Python
python Matplotlib底图中鼠标滑过显示隐藏内容的实例代码
Jul 31 Python
Pycharm 2019 破解激活方法图文详解
Oct 11 Python
Python基础类继承重写实现原理解析
Apr 03 Python
哈工大自然语言处理工具箱之ltp在windows10下的安装使用教程
May 07 Python
django和flask哪个值得研究学习
Jul 31 Python
Python2.6版本pip安装步骤解析
Aug 17 Python
使用豆瓣源来安装python中的第三方库方法
Jan 26 Python
Python制作刷网页流量工具
Apr 23 #Python
Python读取指定目录下指定后缀文件并保存为docx
Apr 23 #Python
正确理解python中的关键字“with”与上下文管理器
Apr 21 #Python
python妙用之编码的转换详解
Apr 21 #Python
简单谈谈Python中的元祖(Tuple)和字典(Dict)
Apr 21 #Python
Python学习笔记之解析json的方法分析
Apr 21 #Python
Python正则抓取网易新闻的方法示例
Apr 21 #Python
You might like
广播爱好者需要了解的天线知识
2021/03/01 无线电
解析如何修改phpmyadmin中的默认登陆超时时间
2013/06/25 PHP
jQuery中的RadioButton,input,CheckBox取值赋值实现代码
2014/02/18 PHP
php数组键名技巧小结
2015/02/17 PHP
php htmlentities()函数的定义和用法
2016/05/13 PHP
PHP实现权限管理功能示例
2017/09/22 PHP
有关DOM元素与事件的3个谜题
2010/11/11 Javascript
jQuery表单域属性过滤器用法分析
2015/02/10 Javascript
深入理解JavaScript系列(18):面向对象编程之ECMAScript实现
2015/03/05 Javascript
JQuery实现样式设置、追加、移除与切换的方法
2015/06/11 Javascript
新手快速学习JavaScript免费教程资源汇总
2015/06/25 Javascript
微信小程序picker组件下拉框选择input输入框的实例
2017/09/20 Javascript
import与export在node.js中的使用详解
2017/09/28 Javascript
详解如何去除vue项目中的#——History模式
2017/10/13 Javascript
Angular4学习教程之HTML属性绑定的方法
2018/01/04 Javascript
小程序获取周围IBeacon设备的方法
2018/10/31 Javascript
vue循环数组改变点击文字的颜色
2019/10/14 Javascript
Vue的Options用法说明
2020/08/14 Javascript
Python中title()方法的使用简介
2015/05/20 Python
Python中操作文件之write()方法的使用教程
2015/05/25 Python
django admin 添加自定义链接方式
2020/03/11 Python
Perfume’s Club英国官网:购买香水和护肤品
2019/11/02 全球购物
了解AppleTalk协议吗
2014/04/01 面试题
专科毕业生学习生活的自我评价
2013/10/26 职场文书
应聘编辑职位自荐信范文
2014/01/05 职场文书
2014年公司庆元旦活动方案
2014/03/05 职场文书
群众路线教育实践活动学习心得体会
2014/10/30 职场文书
2014年勤工助学工作总结
2014/11/24 职场文书
物业接待员岗位职责
2015/04/15 职场文书
2016年中秋祝酒词
2015/11/26 职场文书
销售会议开幕词
2016/03/04 职场文书
成功的商业计划书这样写才最靠谱
2019/07/12 职场文书
Python爬虫之爬取最新更新的小说网站
2021/05/06 Python
Python机器学习应用之基于线性判别模型的分类篇详解
2022/01/18 Python
《异世界四重奏》剧场版6月10日上映 PV视觉图原创角色发表
2022/03/20 日漫
Android开发EditText禁止输入监听及InputFilter字符过滤
2022/06/10 Java/Android