python与字符编码问题


Posted in Python onMay 24, 2019

用python2的小伙伴肯定会遇到字符编码的问题。下面对编码问题做个简单的总结,希望对各位有些帮助。

故事零:编码的定义

我们从“SOS“(国际通用求助信号)开始,它的摩斯密码的编码是:

“…---…”,想一下为什么选用S、O、S来作为求救信号?因为它简单,容易辨别且不容易发错呀!
那么,字符编码就是:

´给定一系列字符,对每个字符赋予一个数值,用数值来代表对应的字符,这一数值就是字符的编码。例如,我们给字符'A'赋予数值0x41,则0x41就是字符'A'的编码。字符编码是字符的表现、储存方式。

字符编码需要处理两件事:

(1)规定一个字符集中的字符由多少个字节表示;

(2)制定该字符集的字符编码表,即该字符集中每个字符对应的(二进制)值。

字符集:´给定一系列字符并赋予对应的编码后,所有这些字符和编码对组成的集合就是字符集。´比如,给定字符列表为{'A','B'}时,{'A'=>0x41,‘B'=>0x42}就是一个字符集。

常见字符集有:

ASCII
GB2312
GBK
GB18030
Big5
Unicode

一张图总结:

python与字符编码问题

故事一:Python2与Python3的字符串类型?

python2中的字符串有str和unicode类型,而python3中字符串只有unicode类型。比如 ‘你好'是str字符串,而 u'你好'则是unicode字符串。

故事二:decode()和encode()傻傻分不清?

decode() 是将str字符串转化为unicode字符串;encode() 是将unicode字符串转化为str字符串。所以要做一些编码的转换通常是以unicode作为中间编码做转换。如name.decode(“GB2312”)表示将GB2312编码的字符串name转换成unicode编码,name.encode(“GB2312”)表示将unicode字符串name转换成GB2312编码。

python与字符编码问题

故事三:UnicodeEncodeError: ‘ascii' codec can't encode character?

我们先看看两张图,是不是很烦?

python与字符编码问题

python与字符编码问题

下面我们看个例子:

python与字符编码问题

当用u'字符串'申明这个字符串变量时就指明了该字符串是使用unicode字符编码。当要将unicode字符串转换为str字符串或者写入文件时,python2默认使用ASCII 码保存数据,而ASCII 码无法识别大于128 的字符,于是报了上面的错误。
附ASCII码表:

python与字符编码问题

故事四:unicode是什么?

unicode可以看做一个终极的字符编码方法,它给出了地球上常用字符的二进制映射,而且所有的二进制字符串唯一地表示一个字符。但是,unicode只给出了字符和二进制串的对应关系,并没有给出存储形式。而不同字符所占用的存储空间可能不同,比如ASCII 在unicode中只占用了一个字节即可,而常用汉字在unicode中需要占用两个字节,还有一些罗马字符可能需要三个或以上字节。如果直接存储的话可能导致无法分割字符串,也无法正确解码出字符。

故事五:UTF-8横空出世?

互联网的普及,强烈要求出现一种统一的编码方式。这时候UTF-8 出场。UTF-8 是unicode在计算机中的一种实现方式。UTF-8是一种变长编码,每个字符占1-4 个字节。UTF-8 将字节分为数值位和标识位,数值位真正保存字符编码数值,标识位表示这个字节是属于哪个字符的、或者该字符占多少个字节。UTF-8 编码方法:

单字节,首位为标识位0;多字节字符首字节标志位1··10开头,字符占多少字节则有多少1,其他字节标识位10开头;

§  单字节字符: 0xxxxxxx (以0 开头标志位,数值位用x 表示)

§  双字节字符: 110xxxxx 10xxxxxx

§  三字节字符: 1110xxxx 10xxxxxx 10xxxxxx

§  四字节字符: 11110xxx 10xxxxxx 10xxxxxx10xxxxxx

unicode变为UTF-8 编码非常简单,unicode二进制按照从低到高,填充UTF-8的数值位,除去那些不真正表示数值的标识位(字节开头的0,10,110,1110和11110),顺序也是由低到高。以汉字“你”为例,可见它的unicode编码为“4f60”(01001111 01100000)。

python与字符编码问题

从“你”的unicode值范围可以看到需要三个字节,接着从低位字节向高位字节填充得到“你”的UTF-8 编码(高位没有填充完则用0补充)。

python与字符编码问题

可以看到将UTF-8 用于标记位(红色)的位去掉,合并可以得到原始的unicode码。

故事六:"unicode-escape"与"unicode-unescape"

“\u”是表示unicode的转义字符,用\uxxxx这种方式表示unicode字符就是”unicode-escape”方式。说人话:´一句话:xxx.decode(“unicode-escape”)相当于把xxx解码成unicode类型并返回。
而用”%uxxxx”的方式表示unicode字符,这种方式就是”unicode-unescape”,常用于javascript。

番外故事七:读了那么多年书,你真的了解“全半角”?

全角---指一个字符占用两个标准字符位置。
半角---指一字符占用一个标准的字符位置。
引申:写程序时双引号、冒号、小括号等为啥如此纠结?
--我国专家在制定GB2312字符集时,ASCII里本来就有的数字、标点、字母都统统重新编了两个字节长的编码。
是不是脑壳疼呀,想想我国程序员因为中英文切换牺牲了多少宝贵时间啊,啊嘿!

总结

以上所述是小编给大家介绍的python与字符编码问题 ,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
跟老齐学Python之编写类之二方法
Oct 11 Python
python杀死一个线程的方法
Sep 06 Python
Python实现替换文件中指定内容的方法
Mar 19 Python
对numpy Array [: ,] 的取值方法详解
Jul 02 Python
pygame游戏之旅 创建游戏窗口界面
Nov 20 Python
浅谈PYTHON 关于文件的操作
Mar 19 Python
75条笑死人的知乎神回复,用60行代码就爬完了
May 06 Python
python正则爬取某段子网站前20页段子(request库)过程解析
Aug 10 Python
Python Sphinx使用实例及问题解决
Jan 17 Python
浅谈Python3实现两个矩形的交并比(IoU)
Jan 18 Python
Kears 使用:通过回调函数保存最佳准确率下的模型操作
Jun 17 Python
Python中的matplotlib绘制百分比堆叠柱状图,并为每一个类别设置不同的填充图案
Apr 20 Python
Python读取stdin方法实例
May 24 #Python
python实践项目之监控当前联网状态详情
May 23 #Python
了解不常见但是实用的Python技巧
May 23 #Python
python远程邮件控制电脑升级版
May 23 #Python
python操作日志的封装方法(两种方法)
May 23 #Python
Python除法之传统除法、Floor除法及真除法实例详解
May 23 #Python
详解Python3除法之真除法、截断除法和下取整对比
May 23 #Python
You might like
CodeIgniter中使用cookie的三种方式详解
2014/07/18 PHP
PHP用FTP类上传文件视频等的简单实现方法
2016/09/23 PHP
自己动手制作jquery插件之自动添加删除行功能介绍
2011/10/14 Javascript
『jQuery』取指定url格式及分割函数应用
2013/04/22 Javascript
BootStrap 轮播插件(carousel)支持左右手势滑动的方法(三种)
2016/07/07 Javascript
js无法获取到html标签的属性的解决方法
2016/07/26 Javascript
图解Javascript——作用域、作用域链、闭包
2017/03/21 Javascript
Angular.js中window.onload(),$(document).ready()的写法浅析
2017/09/28 Javascript
深入理解ES6之数据解构的用法
2018/01/13 Javascript
一步步教你利用Docker设置Node.js
2018/11/20 Javascript
VUE 实现复制内容到剪贴板的两种方法
2019/04/24 Javascript
Vue项目中配置pug解析支持
2019/05/10 Javascript
云服务器部署Node.js项目的方法步骤(小白系列)
2020/03/23 Javascript
利用H5api实现时钟的绘制(javascript)
2020/09/13 Javascript
[01:35]辉夜杯战队访谈宣传片—iG.V
2015/12/25 DOTA
[42:06]2019国际邀请赛全明星赛 8.23
2019/09/05 DOTA
测试、预发布后用python检测网页是否有日常链接
2014/06/03 Python
python实现的希尔排序算法实例
2015/07/01 Python
Python的Django框架中从url中捕捉文本的方法
2015/07/20 Python
Python实现统计给定字符串中重复模式最高子串功能示例
2018/05/16 Python
PyQt5基本控件使用详解:单选按钮、复选框、下拉框
2019/08/05 Python
TensorBoard 计算图的查看方式
2020/02/15 Python
Python可以实现栈的结构吗
2020/05/27 Python
解决pycharm导入本地py文件时,模块下方出现红色波浪线的问题
2020/06/01 Python
Python基于traceback模块获取异常信息
2020/07/23 Python
如何创建一个Flask项目并进行简单配置
2020/11/18 Python
matplotlib 画动态图以及plt.ion()和plt.ioff()的使用详解
2021/01/05 Python
HTML5新增元素如何兼容旧浏览器有哪些方法
2014/05/09 HTML / CSS
简历自荐信
2013/12/02 职场文书
英语系毕业生求职信
2014/07/13 职场文书
无私奉献演讲稿
2014/09/04 职场文书
优秀教师个人总结
2015/02/11 职场文书
学雷锋献爱心活动总结
2015/05/11 职场文书
SQL Server 忘记密码以及重新添加新账号
2022/04/26 SQL Server
解决Mysql报错 Table 'mysql.user' doesn't exist
2022/05/06 MySQL
MySQL中TIMESTAMP类型返回日期时间数据中带有T的解决
2022/12/24 MySQL