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中使用NLTK库实现对词干的提取的教程
Apr 08 Python
深入Python函数编程的一些特性
Apr 13 Python
Python代码调试的几种方法总结
Apr 15 Python
Python实现提取文章摘要的方法
Apr 21 Python
Python操作MongoDB数据库PyMongo库使用方法
Apr 27 Python
Python对列表中的各项进行关联详解
Aug 15 Python
Python排序搜索基本算法之选择排序实例分析
Dec 09 Python
python自动发邮件库yagmail的示例代码
Feb 23 Python
python读写配置文件操作示例
Jul 03 Python
PyTorch-GPU加速实例
Jun 23 Python
Django 如何实现文件上传下载
Apr 08 Python
Python 全局空间和局部空间
Apr 06 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 miniBB中文乱码问题解决方法
2008/11/25 PHP
php通过asort()给关联数组按照值排序的方法
2015/03/18 PHP
php实现通过ftp上传文件
2015/06/19 PHP
php中array_slice和array_splice函数解析
2016/10/18 PHP
几个高效,简洁的字符处理函数
2007/04/12 Javascript
jQuery动态改变图片显示大小(修改版)的实现思路及代码
2013/12/24 Javascript
js实现字符串的16进制编码不加密
2014/04/25 Javascript
jQuery中slice()方法用法实例
2015/01/07 Javascript
javascript实现简单的鼠标拖动效果实例
2015/04/10 Javascript
jQuery实现表格行上下移动和置顶效果
2015/06/05 Javascript
jquery实现全屏滚动
2015/12/28 Javascript
详解vue2父组件传递props异步数据到子组件的问题
2017/06/29 Javascript
二维码图片生成器QRCode.js简单介绍
2017/08/18 Javascript
p5.js入门教程之图片加载
2018/03/20 Javascript
vue2使用keep-alive缓存多层列表页的方法
2018/09/21 Javascript
Vue2.5学习笔记之如何在项目中使用和配置Vue
2018/09/26 Javascript
vue css 引入asstes中的图片无法显示的四种解决方法
2020/03/16 Javascript
[02:35]DOTA2英雄基础教程 狙击手
2014/01/14 DOTA
使用EduBlock轻松学习Python编程
2018/10/08 Python
Python3和PyCharm安装与环境配置【图文教程】
2020/02/14 Python
利用Python脚本批量生成SQL语句
2020/03/04 Python
jupyter notebook 多行输出实例
2020/04/09 Python
关于Theano和Tensorflow多GPU使用问题
2020/06/19 Python
Python浮点型(float)运算结果不正确的解决方案
2020/09/22 Python
python使用ctypes库调用DLL动态链接库
2020/10/22 Python
python读取excel数据并且画图的实现示例
2021/02/08 Python
菲律宾领先的在线时尚商店:Zalora菲律宾
2018/02/08 全球购物
do you have any Best Practice for testing
2016/06/04 面试题
毕业生个人投资创业计划书
2014/01/04 职场文书
勤俭节约倡议书
2014/04/14 职场文书
营销计划书范文
2015/01/17 职场文书
初中美术教学反思
2016/02/17 职场文书
《敬重卑微》读后感3篇
2019/11/26 职场文书
MySQL获取所有分类的前N条记录
2021/05/07 MySQL
Python自动化爬取天眼查数据的实现
2021/06/15 Python
JavaScript事件的委托(代理)的用法示例详解
2022/02/18 Javascript