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实现把xml或xsl转换为html格式
Apr 08 Python
pymongo给mongodb创建索引的简单实现方法
May 06 Python
深入解析Python中的线程同步方法
Jun 14 Python
使用Python对Access读写操作
Mar 30 Python
python3设计模式之简单工厂模式
Oct 17 Python
简单实现python画圆功能
Jan 25 Python
Python cookbook(数据结构与算法)实现查找两个字典相同点的方法
Feb 18 Python
python3利用tcp实现文件夹远程传输
Jul 28 Python
让Python脚本暂停执行的几种方法(小结)
Jul 11 Python
TensorFlow 输出checkpoint 中的变量名与变量值方式
Feb 11 Python
Python使用文件操作实现一个XX信息管理系统的示例
Jul 02 Python
用python实现一个简单的验证码
Dec 09 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
非常不错的MySQL优化的8条经验
2008/03/24 PHP
PHP迅雷、快车、旋风下载专用链转换代码
2010/06/15 PHP
PHP curl 或 file_get_contents 获取需要授权页面的方法
2017/05/05 PHP
图片完美缩放
2006/09/07 Javascript
JavaScript开发规范要求(规范化代码)
2010/08/16 Javascript
让你的博客飘雪花超出屏幕依然看得见
2013/01/04 Javascript
jQuery DOM操作实例
2014/03/05 Javascript
JavaScript中的数组操作介绍
2014/12/30 Javascript
jquery自动补齐功能插件flexselect用法示例
2016/08/06 Javascript
js 点击a标签 获取a的自定义属性方法
2016/11/21 Javascript
基于JavaScript实现验证码功能
2017/04/01 Javascript
webstorm中配置Eslint的两种方式及差异比较详解
2018/10/19 Javascript
用Cordova打包Vue项目的方法步骤
2019/02/02 Javascript
javascript中floor使用方法总结
2019/02/02 Javascript
使用vue开发移动端管理后台的注意事项
2019/03/07 Javascript
JS+CSS3实现的简易钟表效果示例
2019/04/13 Javascript
Vue  webpack 项目自动打包压缩成zip文件的方法
2019/07/24 Javascript
JavaScript如何处理移动端拍摄图片旋转问题
2019/11/16 Javascript
从表单校验看JavaScript策略模式的使用详解
2020/10/17 Javascript
JavaScript中遍历的十种方法总结
2020/12/15 Javascript
element 动态合并表格的步骤
2020/12/31 Javascript
[13:40]TI3青蛙君全程回顾 DOTA2我们为梦想再战
2013/09/13 DOTA
[00:09]DOTA2全国高校联赛 精彩活动引爆全场
2018/05/30 DOTA
Python进阶_关于命名空间与作用域(详解)
2017/05/29 Python
python pillow模块使用方法详解
2019/08/30 Python
使用pytorch实现可视化中间层的结果
2019/12/30 Python
Python变量作用域LEGB用法解析
2020/02/04 Python
CSS3 分类菜单效果
2019/05/27 HTML / CSS
迪士尼英国官方商店:shopDisney UK
2019/09/21 全球购物
新加坡第一大健康与美容零售商:屈臣氏新加坡(Watsons Singapore)
2020/12/11 全球购物
加拿大服装和鞋类零售商:Mark’s
2021/01/04 全球购物
高三家长寄语
2014/04/03 职场文书
最新优秀教师个人先进事迹材料
2014/05/06 职场文书
关于安全的演讲稿
2014/05/09 职场文书
Golang 1.18 多模块Multi-Module工作区模式的新特性
2022/04/11 Golang
Vue3实现简易音乐播放器组件
2022/08/14 Vue.js