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网络编程学习笔记(三):socket网络服务器
Jun 09 Python
Python中文编码那些事
Jun 25 Python
详解Python装饰器由浅入深
Dec 09 Python
轻松理解Python 中的 descriptor
Sep 15 Python
Python解析命令行读取参数--argparse模块使用方法
Jan 23 Python
对Python 文件夹遍历和文件查找的实例讲解
Apr 26 Python
python3监控CentOS磁盘空间脚本
Jun 21 Python
利用Pyhton中的requests包进行网页访问测试的方法
Dec 26 Python
python批量修改ssh密码的实现
Aug 08 Python
python实现IOU计算案例
Apr 12 Python
基于python实现简单网页服务器代码实例
Sep 14 Python
分享一枚pycharm激活码适用所有pycharm版本我的pycharm2020.2.3激活成功
Nov 20 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 采集程序原理分析篇
2010/03/05 PHP
php生成百度sitemap站点地图类函数实例
2014/10/17 PHP
PHP连接MySQL数据的操作要点
2015/03/20 PHP
javascript中的document.open()方法使用介绍
2013/10/09 Javascript
Firefox中通过JavaScript复制数据到剪贴板(Copy to Clipboard 跨浏览器版)
2013/11/22 Javascript
JS获取url链接字符串 location.href
2013/12/23 Javascript
网站繁简切换的JS遇到页面卡死的解决方法
2014/03/12 Javascript
AngularJS基础知识
2014/12/21 Javascript
用JS中split方法实现彩色文字背景效果实例
2016/08/24 Javascript
jQuery简单实现中间浮窗效果
2016/09/04 Javascript
关于jQuery里prev()的简单操作代码
2017/10/27 jQuery
Mac 安装 nodejs方法(图文详细步骤)
2017/10/30 NodeJs
详解50行代码,Node爬虫练手项目
2019/04/22 Javascript
[03:45]Newbee战队出征西雅图 决战2016国际邀请赛
2016/08/02 DOTA
在Python中使用__slots__方法的详细教程
2015/04/28 Python
Python yield 使用浅析
2015/05/28 Python
Djang中静态文件配置方法
2015/07/30 Python
详解Python中的array数组模块相关使用
2016/07/05 Python
对python中数组的del,remove,pop区别详解
2018/11/07 Python
python binascii 进制转换实例
2019/06/12 Python
python的faker库用法
2019/11/28 Python
基于python判断目录或者文件代码实例
2019/11/29 Python
PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译
2020/04/15 Python
Python TestSuite生成测试报告过程解析
2020/07/23 Python
GNC健安喜官方海外旗舰店:美国著名保健品牌
2017/01/04 全球购物
英国家居装饰品、户外家具和玻璃器皿购物网站:Rinkit.com
2019/11/04 全球购物
Java基础面试题
2014/07/19 面试题
我爱我家教学反思
2014/05/01 职场文书
贷款担保申请书
2014/05/20 职场文书
食品安全汇报材料
2014/08/18 职场文书
办理房产证委托书
2014/09/18 职场文书
大学团日活动总结书
2015/05/11 职场文书
KVM基础命令详解
2022/04/30 Servers
Python开发简易五子棋小游戏
2022/05/02 Python
Java实现扫雷游戏详细代码讲解
2022/05/25 Java/Android
MySQL池化框架学习接池自定义
2022/07/23 MySQL