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基础教程之lambda表达式使用方法
Feb 12 Python
python实现文件名批量替换和内容替换
Mar 20 Python
在Python的setuptools框架下生成egg的教程
Apr 13 Python
python脚本内运行linux命令的方法
Jul 02 Python
Python中的anydbm模版和shelve模版使用指南
Jul 09 Python
Python多层嵌套list的递归处理方法(推荐)
Jun 08 Python
Python利用递归和walk()遍历目录文件的方法示例
Jul 14 Python
基于python的字节编译详解
Sep 20 Python
深入理解Django的自定义过滤器
Oct 17 Python
python入门之基础语法学习笔记
Feb 08 Python
Pycharm插件(Grep Console)自定义规则输出颜色日志的方法
May 27 Python
Python使用Matlab命令过程解析
Jun 04 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/03/10 PHP
php字符串分割函数explode的实例代码
2013/02/07 PHP
destoon切换城市后实现logo旁边显示地区名称的方法
2014/08/21 PHP
php实现比较两个字符串日期大小的方法
2015/05/12 PHP
ajax java 实现自动完成功能
2012/12/19 Javascript
深入领悟JavaScript中的面向对象
2013/11/18 Javascript
超炫的jquery仿flash导航栏特效
2014/11/11 Javascript
JavaScript中的逻辑判断符&amp;&amp;、||与!介绍
2014/12/31 Javascript
封装了jQuery的Ajax请求全局配置
2015/02/05 Javascript
JS模式之简单的订阅者和发布者模式完整实例
2015/06/30 Javascript
jquery实现弹出层登录和全屏层注册特效
2015/08/28 Javascript
在Web项目中引入Jquery插件报错的完美解决方案(图解)
2016/09/19 Javascript
JS实现的简单轮播图运动效果示例
2016/12/22 Javascript
Vue + Webpack + Vue-loader学习教程之功能介绍篇
2017/03/14 Javascript
vue.js实现刷新当前页面的方法教程
2017/07/05 Javascript
node app 打包工具pkg的具体使用
2019/01/17 Javascript
layui 动态设置checbox 选中状态的例子
2019/09/02 Javascript
layui.use模块外部使用其内部定义的js封装函数方法
2019/09/16 Javascript
axios实现文件上传并获取进度
2020/03/25 Javascript
JavaScript动态生成表格的示例
2020/11/02 Javascript
跟老齐学Python之有容乃大的list(1)
2014/09/14 Python
用python生成1000个txt文件的方法
2018/10/25 Python
一步步教你用python的scrapy编写一个爬虫
2019/04/17 Python
对DJango视图(views)和模版(templates)的使用详解
2019/07/17 Python
Django单元测试中Fixtures用法详解
2020/02/25 Python
如何查看python关键字
2021/01/17 Python
John Varvatos官方网站:设计师男士时装
2017/02/08 全球购物
初中校园之声广播稿
2014/01/15 职场文书
员工保密承诺书
2014/05/28 职场文书
农民工预备党员思想汇报
2014/09/14 职场文书
2014班子“三严三实”对照检查材料思想汇报
2014/09/18 职场文书
个人创业事迹材料
2014/12/30 职场文书
出国留学单位推荐信
2015/03/26 职场文书
2015年行风建设工作总结
2015/05/15 职场文书
在js中修改html body的样式
2021/11/11 Javascript
python缺失值填充方法示例代码
2022/12/24 Python