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判断字符串是否纯数字的方法
Nov 19 Python
利用matplotlib+numpy绘制多种绘图的方法实例
May 03 Python
TF-IDF算法解析与Python实现方法详解
Nov 16 Python
Python变量赋值的秘密分享
Apr 03 Python
python 自定义对象的打印方法
Jan 12 Python
python3使用matplotlib绘制散点图
Mar 19 Python
我就是这样学习Python中的列表
Jun 02 Python
Python基础学习之基本数据结构详解【数字、字符串、列表、元组、集合、字典】
Jun 18 Python
Python实用工具FuckIt.py介绍
Jul 02 Python
python issubclass 和 isinstance函数
Jul 25 Python
Python调用graphviz绘制结构化图形网络示例
Nov 22 Python
如何将你的应用迁移到Python3的三个步骤
Dec 22 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
支持oicq头像的留言簿(二)
2006/10/09 PHP
在PHP中利用wsdl创建标准webservice的实现代码
2011/12/07 PHP
FireFox浏览器使用Javascript上传大文件
2013/10/30 PHP
php商品对比功能代码分享
2015/09/24 PHP
PHP实现的数组和XML文件相互转换功能示例
2018/03/15 PHP
JQuery判断子iframe何时加载完成解决方案
2013/08/20 Javascript
浅析JQuery UI Dialog的样式设置问题
2013/12/18 Javascript
原生js实现复制对象、扩展对象 类似jquery中的extend()方法
2014/08/30 Javascript
js时间日期格式化封装函数
2014/12/02 Javascript
理解javascript中的原型和原型链
2015/07/30 Javascript
js实现右键自定义菜单
2016/12/03 Javascript
Bootstrap CSS布局之表单
2016/12/17 Javascript
jQuery中select与datalist制作下拉菜单时的区别浅析
2016/12/30 Javascript
Angular.js之作用域scope'@','=','&amp;'实例详解
2017/02/28 Javascript
深入理解ES6之数据解构的用法
2018/01/13 Javascript
Layui给数据表格动态添加一行并跳转到添加行所在页的方法
2018/08/20 Javascript
vue.js+ElementUI实现进度条提示密码强度效果
2020/01/18 Javascript
JavaScript动画实例之粒子文本的实现方法详解
2020/07/28 Javascript
如何利用JS将手机号中间四位变成*号
2020/09/29 Javascript
[01:14:10]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS Orenda
2014/05/22 DOTA
Django的信号机制详解
2017/05/05 Python
Python对文件和目录进行操作的方法(file对象/os/os.path/shutil 模块)
2017/05/08 Python
Python分治法定义与应用实例详解
2017/07/28 Python
python生成tensorflow输入输出的图像格式的方法
2018/02/12 Python
python将文本中的空格替换为换行的方法
2018/03/19 Python
python主线程捕获子线程的方法
2018/06/17 Python
matplotlib绘制多个子图(subplot)的方法
2019/12/03 Python
如何将你的应用迁移到Python3的三个步骤
2019/12/22 Python
matplotlib部件之套索Lasso的使用
2021/02/24 Python
初三学习决心书
2014/03/11 职场文书
公司寄语大全
2014/04/10 职场文书
护理专业毕业生自荐书
2014/05/24 职场文书
安全施工标语
2014/06/07 职场文书
学习普通话的体会
2014/11/07 职场文书
公司劳动纪律管理制度
2015/08/04 职场文书
2016年员工政治思想表现评语
2015/12/02 职场文书