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抓取京东价格分析京东商品价格走势
Jan 09 Python
Python正则表达式教程之三:贪婪/非贪婪特性
Mar 02 Python
浅谈Python2.6和Python3.0中八进制数字表示的区别
Apr 28 Python
python+tkinter编写电脑桌面放大镜程序实例代码
Jan 16 Python
python3爬虫获取html内容及各属性值的方法
Dec 17 Python
python url 参数修改方法
Dec 26 Python
Django中自定义模型管理器(Manager)及方法
Sep 23 Python
Python创建一个元素都为0的列表实例
Nov 28 Python
Python 模拟动态产生字母验证码图片功能
Dec 24 Python
Python函数的返回值、匿名函数lambda、filter函数、map函数、reduce函数用法实例分析
Dec 26 Python
Python定义函数实现累计求和操作
May 03 Python
Python anaconda安装库命令详解
Oct 16 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
PHP图片等比例缩放生成缩略图函数分享
2014/06/10 PHP
php bootstrap实现简单登录
2016/03/08 PHP
php中final关键字用法分析
2016/12/07 PHP
PNGHandler-借助JS让PNG图在IE下实现透明(包括背景图)
2007/08/31 Javascript
Jquery插件 easyUI属性汇总
2011/01/19 Javascript
JavaScript中的数学运算介绍
2014/12/29 Javascript
简单解析JavaScript中的__proto__属性
2016/05/10 Javascript
js H5 canvas投篮小游戏
2016/08/18 Javascript
详解js界面跳转与值传递
2016/11/22 Javascript
Angular4学习笔记之新建项目的方法
2017/07/18 Javascript
vue-cli+webpack项目 修改项目名称的方法
2018/02/28 Javascript
Vue自定义属性实例分析
2019/02/23 Javascript
JS中封装axios来管控api的2种方式
2019/09/11 Javascript
jquery轻量级数字动画插件countUp.js使用详解
2019/10/17 jQuery
原生javascript制作的拼图游戏实现方法详解
2020/02/23 Javascript
[02:14]2016国际邀请赛中国区预选赛Ehome晋级之路
2016/07/01 DOTA
[01:52]DOTA2完美大师赛Vega战队趣味视频——kpii老师小课堂
2017/11/25 DOTA
创建pycharm的自定义python模板方法
2018/05/23 Python
Python基于opencv实现的简单画板功能示例
2019/03/04 Python
python3 pygame实现接小球游戏
2019/05/14 Python
django echarts饼图数据动态加载的实例
2019/08/12 Python
pandas read_excel()和to_excel()函数解析
2019/09/19 Python
Pycharm小白级简单使用教程
2020/01/08 Python
Python datetime 格式化 明天,昨天实例
2020/03/02 Python
浅谈pycharm导入pandas包遇到的问题及解决
2020/06/01 Python
浅谈移动端网页图片预加载方案
2018/11/05 HTML / CSS
澳大利亚在线划船、露营和钓鱼商店:BCF Australia
2020/03/22 全球购物
客房主管岗位职责
2013/12/09 职场文书
应届毕业生简历自我评价
2014/01/31 职场文书
投资合作协议书范本
2014/04/17 职场文书
社区科普工作方案
2014/06/03 职场文书
运动会稿件100字
2014/09/24 职场文书
银行授权委托书样本
2014/10/13 职场文书
小学班主任个人总结
2015/03/03 职场文书
会议简讯范文
2015/07/20 职场文书
优质服务心得体会(共4篇)
2016/01/22 职场文书