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导入oracle数据的方法
Jul 10 Python
Python基于回溯法子集树模板解决选排问题示例
Sep 07 Python
简单了解python模块概念
Jan 11 Python
python如何通过twisted实现数据库异步插入
Mar 20 Python
高效使用Python字典的清单
Apr 04 Python
python使用turtle库绘制时钟
Mar 25 Python
解决Python pandas df 写入excel 出现的问题
Jul 04 Python
python实现输入的数据在地图上生成热力图效果
Dec 06 Python
Pytorch根据layers的name冻结训练方式
Jan 06 Python
将tensorflow模型打包成PB文件及PB文件读取方式
Jan 23 Python
flask 框架操作MySQL数据库简单示例
Feb 02 Python
Python+OpenCV实现图像的全景拼接
Mar 05 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 获取目录下的图片并随机显示的代码
2009/12/28 PHP
php缩放gif和png图透明背景变成黑色的解决方法
2014/10/14 PHP
thinkphp中html:list标签传递多个参数实例
2014/10/30 PHP
PHP链表操作简单示例
2016/10/15 PHP
php定期拉取数据对比方法实例
2019/09/22 PHP
checkbox使用示例
2013/08/23 Javascript
css+js实现部分区域高亮可编辑遮罩层
2014/03/04 Javascript
Javascript中的数据类型之旅
2015/10/18 Javascript
基于jquery实现智能提示控件intellSeach.js
2016/03/17 Javascript
JQuery 的跨域方法推荐_可跨任何网站
2016/05/18 Javascript
简单实现js选项卡切换效果
2017/02/09 Javascript
javascript checkbox/radio onchange不能兼容ie8处理办法
2017/06/13 Javascript
nodejs爬虫初试superagent和cheerio
2018/03/05 NodeJs
NodeJS 实现多语言的示例代码
2018/09/11 NodeJs
Vue动态组件和异步组件原理详解
2019/05/06 Javascript
vue实现倒计时获取验证码效果
2020/04/17 Javascript
layui table 复选框跳页后再回来保持原来选中的状态示例
2019/10/26 Javascript
vue el-upload上传文件的示例代码
2020/12/21 Vue.js
进一步探究Python中的正则表达式
2015/04/28 Python
Python计算三维矢量幅度的方法
2015/06/15 Python
网站渗透常用Python小脚本查询同ip网站
2017/05/08 Python
pyspark 读取csv文件创建DataFrame的两种方法
2018/06/07 Python
对python中array.sum(axis=?)的用法介绍
2018/06/28 Python
Django中信号signals的简单使用方法
2019/07/04 Python
jupyter notebook中新建cell的方法与快捷键操作
2020/04/22 Python
Python3爬虫里关于代理的设置总结
2020/07/30 Python
详解Anaconda安装tensorflow报错问题解决方法
2020/11/01 Python
HTML5 canvas 瀑布流文字效果的示例代码
2018/01/31 HTML / CSS
Shopee越南:东南亚与台湾电商平台
2019/02/03 全球购物
大学生活自我评价
2014/04/09 职场文书
党委书记群众路线对照检查材料思想汇报
2014/10/04 职场文书
超市员工辞职信范文
2015/05/12 职场文书
毕业感言怎么写
2015/07/31 职场文书
会计主管竞聘书
2015/09/15 职场文书
十一月早安语录:把心放轻,人生就是一朵自在的云
2019/11/04 职场文书
浅谈sql_@SelectProvider及使用注意说明
2021/08/04 Java/Android