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内置函数Type()函数一个有趣的用法
Feb 18 Python
python实现汉诺塔递归算法经典案例
Mar 01 Python
sublime python3 输入换行不结束的方法
Apr 19 Python
对Python中type打开文件的方式介绍
Apr 28 Python
python2.7实现邮件发送功能
Dec 12 Python
python程序快速缩进多行代码方法总结
Jun 23 Python
Pycharm新建模板默认添加个人信息的实例
Jul 15 Python
Python定时任务工具之APScheduler使用方式
Jul 24 Python
python 3.7.4 安装 opencv的教程
Oct 10 Python
基于Python实现拆分和合并GIF动态图
Oct 22 Python
如何利用python web框架做文件流下载的实现示例
Jun 02 Python
pytorch fine-tune 预训练的模型操作
Jun 03 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
十大催泪虐心动漫电影,有几部你还没看
2020/03/04 日漫
PHP压缩html网页代码(清除空格,换行符,制表符,注释标记)
2012/04/02 PHP
JavaScript实现滚动栏效果的方法
2015/04/27 PHP
使用PHP反射机制来构造&quot;CREATE TABLE&quot;的sql语句
2019/03/21 PHP
jquery animate实现鼠标放上去显示离开隐藏效果
2013/07/21 Javascript
js写出遮罩层登陆框和对联广告并自动跟随滚动条滚动
2014/04/29 Javascript
JS+CSS实现可拖拽的漂亮圆角特效弹出层完整实例
2015/02/13 Javascript
原生JavaScript实现Ajax的方法
2016/04/07 Javascript
深入浅析knockout源码分析之订阅
2016/07/12 Javascript
Jquery组件easyUi实现选项卡切换示例
2016/08/23 Javascript
Omi v1.0.2发布正式支持传递javascript表达式
2017/03/21 Javascript
vue异步axios获取的数据渲染到页面的方法
2018/08/09 Javascript
JS开发常用工具函数(小结)
2019/07/04 Javascript
[01:02:55]CHAOS vs Mineski 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
用python实现的去除win下文本文件头部BOM的代码
2013/02/10 Python
Linux下Python获取IP地址的代码
2014/11/30 Python
Python与Redis的连接教程
2015/04/22 Python
flask中主动抛出异常及统一异常处理代码示例
2018/01/18 Python
TensorFlow入门使用 tf.train.Saver()保存模型
2018/04/24 Python
python3.5基于TCP实现文件传输
2020/03/20 Python
pytorch使用Variable实现线性回归
2019/05/21 Python
python pycharm的安装及其使用
2019/10/11 Python
python实现双人五子棋(终端版)
2020/12/30 Python
Html5新增标签与样式及让元素水平垂直居中
2019/07/11 HTML / CSS
天猫国际进口超市直营:官方直采,一站购齐
2017/12/11 全球购物
澳大利亚宠物食品和药物在线:Jumbo Pets
2018/03/24 全球购物
优秀的毕业生的自我评价
2013/12/12 职场文书
超市总经理岗位职责
2014/02/02 职场文书
实习老师离校感言
2014/02/03 职场文书
探亲假请假条
2014/04/11 职场文书
大学班级文化建设方案
2014/05/06 职场文书
幼儿园教师师德师风演讲稿:爱我所爱 无悔青春
2014/09/10 职场文书
基层党员群众路线整改措施及努力方向
2014/10/28 职场文书
高中家长意见怎么写
2015/06/03 职场文书
2016年“5.12”护士节致辞
2015/07/31 职场文书
MySQL 分组查询的优化方法
2021/05/12 MySQL