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计算圆周率pi的方法
Jul 11 Python
Python解惑之True和False详解
Apr 24 Python
Python实现扣除个人税后的工资计算器示例
Mar 26 Python
python实现对csv文件的列的内容读取
Jul 04 Python
利用Python正则表达式过滤敏感词的方法
Jan 21 Python
如何用C代码给Python写扩展库(Cython)
May 17 Python
解决pycharm remote deployment 配置的问题
Jun 27 Python
Python Threading 线程/互斥锁/死锁/GIL锁
Jul 21 Python
Python环境下安装PyGame和PyOpenGL的方法
Mar 25 Python
Python实现多线程下载脚本的示例代码
Apr 03 Python
Python3 requests模块如何模仿浏览器及代理
Jun 15 Python
python多线程semaphore实现线程数控制的示例
Aug 10 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
坏狼的PHP学习教程之第2天
2008/06/15 PHP
php 更新数据库中断的解决方法
2009/06/05 PHP
PHP数组交集的优化代码分析
2011/03/06 PHP
php实现的click captcha点击验证码类实例
2014/09/23 PHP
smarty缓存用法分析
2014/12/16 PHP
php实现约瑟夫问题的方法小结
2015/03/23 PHP
php下载文件,添加响应头的简单实例
2016/09/22 PHP
js用图作提交按钮或超连接
2008/03/26 Javascript
下载站控制介绍字数显示的脚本 显示全部 隐藏介绍等功能
2009/09/19 Javascript
Javascript图像处理—平滑处理实现原理
2012/12/28 Javascript
IE下window.onresize 多次调用与死循环bug处理方法介绍
2013/11/12 Javascript
Javascript通过overflow控制列表闭合与展开的方法
2015/05/15 Javascript
ES6下React组件的写法示例代码
2017/05/04 Javascript
JS实现下拉菜单列表与登录注册弹窗效果
2017/08/10 Javascript
React+react-dropzone+node.js实现图片上传的示例代码
2017/08/23 Javascript
简单谈谈js的数据类型
2017/09/25 Javascript
React Native模块之Permissions权限申请的实例相机
2017/09/28 Javascript
vue组件之Alert的实现代码
2017/10/17 Javascript
详解Axios统一错误处理与后置
2018/09/26 Javascript
Vue2.0+Vux搭建一个完整的移动webApp项目的示例
2019/03/19 Javascript
小程序scroll-view安卓机隐藏横向滚动条的实现详解
2019/05/16 Javascript
vue集成chart.js的实现方法
2019/08/20 Javascript
JS内置对象和Math对象知识点详解
2020/04/03 Javascript
Vue+Openlayers自定义轨迹动画
2020/09/24 Javascript
[00:32]2018DOTA2亚洲邀请赛EG出场
2018/04/03 DOTA
Python使用min、max函数查找二维数据矩阵中最小、最大值的方法
2018/05/15 Python
Python交互环境下打印和输入函数的实例内容
2020/02/16 Python
Python3连接Mysql8.0遇到的问题及处理步骤
2020/02/17 Python
详解Python 循环嵌套
2020/07/09 Python
python使用smtplib模块发送邮件
2020/12/17 Python
大学生标准推荐信范文
2013/11/25 职场文书
班队活动设计方案
2014/01/30 职场文书
学生评语大全
2014/04/18 职场文书
银行给客户的感谢信
2015/01/23 职场文书
数学复习课教学反思
2016/02/18 职场文书
js判断两个数组相等的5种方法
2022/05/06 Javascript