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 除法小技巧
Sep 06 Python
python中字典dict常用操作方法实例总结
Apr 04 Python
python实现的文件同步服务器实例
Jun 02 Python
Python编程实现微信企业号文本消息推送功能示例
Aug 21 Python
python写一个md5解密器示例
Feb 23 Python
Python常用字符串替换函数strip、replace及sub用法示例
May 21 Python
解决使用pycharm提交代码时冲突之后文件丢失找回的方法
Aug 05 Python
解决Pycharm调用Turtle时 窗口一闪而过的问题
Feb 16 Python
pandas 空数据处理方法详解
Nov 02 Python
浅谈Python类中的self到底是干啥的
Nov 11 Python
python中的socket实现ftp客户端和服务器收发文件及md5加密文件
Apr 01 Python
TensorFlow tf.nn.conv2d_transpose是怎样实现反卷积的
Apr 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模块 Memcached功能多于Memcache
2011/06/14 PHP
使用php判断网页是否gzip压缩
2013/06/25 PHP
php类自动装载、链式操作、魔术方法实现代码
2017/07/23 PHP
基于JQuery模仿苹果桌面的Dock效果(初级版)
2012/10/15 Javascript
Jquery时间验证和转换工具小例子
2013/07/01 Javascript
Jquery实现自定义弹窗示例
2014/03/12 Javascript
fixedBox固定div漂浮代码支持ie6以上大部分主流浏览器
2014/06/26 Javascript
js监听鼠标事件控制textarea输入字符串的个数
2014/09/29 Javascript
javascript面向对象之共享成员属性与方法及prototype关键字用法
2015/01/13 Javascript
js老生常谈之this,constructor ,prototype全面解析
2016/04/05 Javascript
Kindeditor在线文本编辑器如何过滤HTML
2016/04/14 Javascript
原生js三级联动的简单实现代码
2016/06/07 Javascript
vue2.0+webpack环境的构造过程
2016/11/08 Javascript
JS中parseInt()和map()用法分析
2016/12/16 Javascript
详解angularJS+Ionic移动端图片上传的解决办法
2017/09/13 Javascript
VUEJS 2.0 子组件访问/调用父组件的实例
2018/02/10 Javascript
浅谈webpack 四个核心概念之Entry
2019/06/12 Javascript
[05:05]DOTA2亚洲邀请赛 战队出场仪式
2015/02/07 DOTA
python抓取京东商城手机列表url实例代码
2013/12/18 Python
Python中几种操作字符串的方法的介绍
2015/04/09 Python
通过数据库向Django模型添加字段的示例
2015/07/21 Python
详解python的几种标准输出重定向方式
2016/08/15 Python
树莓派实现移动拍照
2019/06/22 Python
Python3爬虫mitmproxy的安装步骤
2020/07/29 Python
Python如何测试stdout输出
2020/08/10 Python
吃透移动端 1px的具体用法
2019/12/16 HTML / CSS
英国大码女性时装零售商:Evans
2018/08/29 全球购物
高中生学期学习自我评价
2014/02/24 职场文书
《神奇的克隆》教学反思
2014/04/10 职场文书
清明节网上祭英烈活动总结
2014/04/30 职场文书
中专生自荐信
2014/06/25 职场文书
机票销售员态度不好检讨书
2014/09/27 职场文书
《认识年月日》教学反思
2016/02/19 职场文书
使用numpy实现矩阵的翻转(flip)与旋转
2021/06/03 Python
MySQL 开窗函数
2022/02/15 MySQL
Dubbo+zookeeper搭配分布式服务的过程详解
2022/04/03 Java/Android