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实现在每个独立进程中运行一个函数的方法
Apr 23 Python
Python使用cx_Oracle模块将oracle中数据导出到csv文件的方法
May 16 Python
Python selenium 三种等待方式详解(必会)
Sep 15 Python
Python 3中print函数的使用方法总结
Aug 08 Python
python 获取键盘输入,同时有超时的功能示例
Nov 13 Python
Django异步任务之Celery的基本使用
Mar 23 Python
介绍一款python类型检查工具pyright(推荐)
Jul 03 Python
python tkinter图形界面代码统计工具
Sep 18 Python
Django密码存储策略分析
Jan 09 Python
django-csrf使用和禁用方式
Mar 13 Python
python实现梯度下降法
Mar 24 Python
python安装及变量名介绍详解
Dec 12 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 base64+gzinflate压缩编码和解码代码
2008/10/03 PHP
php面向对象全攻略 (一) 面向对象基础知识
2009/09/30 PHP
PHP生成不重复随机数的方法汇总
2014/11/19 PHP
php+mysqli使用面向对象方式查询数据库实例
2015/01/29 PHP
php文件上传、下载和删除示例
2020/08/28 PHP
thinkPHP5.1框架使用SemanticUI实现分页功能示例
2019/08/03 PHP
PHP的JSON封装、转变及输出操作示例
2019/09/27 PHP
JavaScript 三种不同位置代码的写法
2009/10/25 Javascript
基于jquery的修改当前TAB显示标题的代码
2010/12/11 Javascript
javascript-简单的计算器实现步骤分解(附图)
2013/05/30 Javascript
jQuery插件Validate实现自定义表单验证
2016/01/18 Javascript
Ajax+FormData+javascript实现无刷新表单信息提交
2016/10/24 Javascript
js实现符合国情的日期插件详解
2017/01/19 Javascript
AngularJS路由Ui-router模块用法示例
2017/05/29 Javascript
vue教程之toast弹框全局调用示例详解
2020/08/24 Javascript
jQuery 改变P标签文本值方法
2018/02/24 jQuery
JavaScript实现动态添加、移除元素或属性的方法分析
2019/01/03 Javascript
JavaScript数组去重的方法总结【12种方法,号称史上最全】
2019/02/28 Javascript
js实现Element中input组件的部分功能并封装成组件(实例代码)
2021/03/02 Javascript
[03:23]我的刀塔你不可能这么可爱 第一期金萌萌的故事
2014/06/20 DOTA
[52:00]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 LGD vs Optic
2018/04/02 DOTA
python实现数通设备tftp备份配置文件示例
2014/04/02 Python
Python实现简单状态框架的方法
2015/03/19 Python
将pip源更换到国内镜像的详细步骤
2019/04/07 Python
Pycharm中安装wordcloud等库失败问题及终端通过pip安装的Python库如何添加到Pycharm解释器中(推荐)
2020/05/10 Python
美国益智玩具购物网站:Fat Brain Toys
2017/11/03 全球购物
西班牙国家航空官方网站:Iberia
2017/11/16 全球购物
机电一体化毕业生自荐信
2014/06/19 职场文书
国际语言毕业生求职信
2014/07/08 职场文书
普通党员四风问题对照检查材料
2014/09/27 职场文书
2014年实习班主任工作总结
2014/11/08 职场文书
2015年幼儿教育工作总结
2015/07/24 职场文书
详解使用 CSS prefers-* 规范提升网站的可访问性与健壮性
2021/05/25 HTML / CSS
OpenCV-Python实现轮廓的特征值
2021/06/09 Python
【海涛dota解说】一房久违的影魔魂守二连发
2022/04/01 DOTA
Python接口自动化之文件上传/下载接口详解
2022/04/05 Python