python2.7编码与解码
常见的编码
ASCII: 美国人发明的,只编码英文字母和符号,1个字节。
GB2312: 中国人发明的,增加了中文汉字和符号,2个字节。
Unicode: 为了把所有语言都统一到一套编码里,一般是2个字节,生僻字4个字节。
UTF-8: 为了节省英文字符内存空间,UTF-8可变长编码,常用的英文字母被编码成1个字节,汉字通常是3个字节,生僻的字符编码成4-6个字节。
>>> S = '中文'
>>> print type(S), len(S)
<type 'str'> 4 >>> unicodeS = u'中文'
>>> print type(unicodeS), len(unicodeS)
<type 'unicode'> 2 >>> utfS = u'中文'.encode('utf-8')
>>> print type(utfS), len(utfS)
<type 'str'> 6
在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码,这样可以节省很多存储空间。
其中,python2和python3系统默认编码分别是ascii和utf-8,以python2.7为例:
>>> import sys
>>> sys.getdefaultencoding()
'ascii' >>> a = 'hello'
>>> print type(a)
<type 'str'>
>>> b = a.decode('ascii')
>>> print type(b)
<type 'unicode'>
>>> c = a.decode('ascii').encode('utf-8')
>>> print type(c)
<type 'str'>
然而python2.7中,比较麻烦的还是有两种数据模型来支持字符串这种数据类型,str和unicode(python3改进后只有unicode一种),比如
s = '中文'
就是str类型的字符串,而u=u"中文"
就是一个unicode类型的字符串。unicode是由str类型的字符串解码后得到,unicode也可以编码成str类型。即
str --> decode -->unicode
unicode --> encode --> str
在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。
注:Unicode 格式:像\u0000;二进制编码 格式:像\x00\x00,其中utf-8,gbk就是二进制编码;
>>> s1 = u'中文'
>>> type(s1)
<type 'unicode'>
>>> s2 = 'ABC'
>>> type(s2)
<type 'str'> #字符串转码成unicode对象
>>> u'ABC'
u'ABC'
>>> u'中文'
u'\u4e2d\u6587' #英文字符串编码成utf8格式
>>> 'ABC'.encode('utf-8')
'ABC'
>>> u'ABC'.encode('utf-8')
'ABC' #中文字符串需先转码成unicode,再编码成utf8格式
>>> '中文'.encode('utf-8') Traceback (most recent call last):
File "<pyshell#15>", line 1, in <module>
'中文'.encode('utf-8')
UnicodeDecodeError: 'utf8' codec can't decode byte 0xd6 in position 0: invalid continuation byte >>> u'中文'.encode('utf-8')
'\xe4\xb8\xad\xe6\x96\x87'
>>> u'\u4e2d\u6587'.encode('utf-8')
'\xe4\xb8\xad\xe6\x96\x87' #字符串从utf8格式解码成unicode
>>> 'ABC'.decode('utf-8')
u'ABC'
>>> '\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
u'\u4e2d\u6587'
>>> print '\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
中文
编码检验和转换
#检查编码
>>> import urllib
>>> rawdata = urllib.urlopen('http://www.google.cn/').read()
>>> import chardet
>>> chardet.detect(rawdata)
{'confidence': 0.99, 'encoding': 'utf-8'} #将String对象从UTF-8内码转换为gbk,相反则s.decode('gbk').encode('utf-8')
>>> rawdata.decode('utf-8').encode('gbk') #以unicode为中介实现编码或解码
>>> u'中文'.encode('gbk')
'\xd6\xd0\xce\xc4'
>>> u'中文'.encode('utf-8')
'\xe4\xb8\xad\xe6\x96\x87'
>>> '\xd6\xd0\xce\xc4'.decode('gbk')
u'\u4e2d\u6587'
>>> print u'\u4e2d\u6587'
中文
>>> '\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
u'\u4e2d\u6587'
>>> print u'\u4e2d\u6587'
中文
其中,decode的函数原型是 decode([encoding], [errors='strict']),可以用第二个参数控制错误处理的策略。
默认的参数就是strict,代表遇到非法字符时抛出异常;
如果设置为ignore,则会忽略非法字符;
如果设置为replace,则会用?取代非法字符;
读写文件编码
以test.txt文件为例,文件内容为“测试”。
>>> #coding=utf-8
>>> f = open("test.txt")
>>> s = f.read()
>>> print type(s)
<type 'str'>
>>> s
'\xb2\xe2\xca\xd4'
>>> u = s.decode("gbk")
>>> u
u'\u6d4b\u8bd5'
>>> f.write(u.encode("utf-8"))
>>> print u
测试
python2.7编码与解码的更多相关文章
- Python2/3的中、英文字符编码与解码输出: UnicodeDecodeError: 'ascii' codec can't decode/encode
摘要:Python中文虐我千百遍,我待Python如初恋.本文主要介绍在Python2/3交互模式下,通过对中文.英文的处理输出,理解Python的字符编码与解码问题(以点破面). 前言:字符串的编码 ...
- 关于Python2字符编码的体会
对于Python的字符编码问题也懵了很久,最近做爬虫多次遇到网页转码的问题,干脆彻底解决掉!Just Do it! 1.两种类型str与unicode str和unicode都是basestring的 ...
- python3中的编码与解码(超好理解)
编码和解码是针对数据而言的,数据能干什么呢?无非就是用来显示,储存和传输的: 储存和传输数据当然是希望数据越小越好,所以发明了utf-8这种数据编码显示:它智能将英文用一个字节表示,欧洲的字符用两个字 ...
- Day5 Pyhton基础之编码与解码(四)
1.编码与解码 1.1现在常用的编码类型
- URL地址编码和解码
0. 参考 [整理]关于http(GET或POST)请求中的url地址的编码(encode)和解码(decode) python3中的urlopen对于中文url是如何处理的? 中文URL的编码问题 ...
- Python基础-编码与解码
一.什么是编码 编码是指信息从一种形式或格式转换为另一种形式或格式的过程. 在计算机中,编码,简而言之,就是将人能够读懂的信息(通常称为明文)转换为计算机能够读懂的信息.众所周知,计算机能够读懂的 ...
- python2.X编码
1.Python文件的编码 在Python文件中,可以在第一或第二行指定文件的编码格式(以注释的形式加),这也是Python语法规定的,见http://www.python.org/peps/pep- ...
- 【转】python基础-编码与解码
[转自:https://www.cnblogs.com/OldJack/p/6658779.html] 一.什么是编码 编码是指信息从一种形式或格式转换为另一种形式或格式的过程. 在计算机中,编码,简 ...
- python学习笔记09-python编码与解码
二进制编码: --->ASCII:只能存英文和拉丁字符 一个字符占一个字节:8位 ------>gb2312:只能存6700多个中文: 1980年发表 ----------->gbk ...
随机推荐
- 辨异 —— Java 中的抽象类和接口
接口优于抽象类.-- <Effective Java>(Item 18) 0. 语法区别 抽象类允许给出某些方法的实现,接口不允许: 为了实现由抽象类定义的类型(type),类必须成为抽象 ...
- Hdu-2892 area 计算几何 圆与凸多边形面积交
题面 题意:有一个凸多边形岛屿,然后告诉你从高空(x,y,h)投下炸弹,爆炸半径r,飞机水平速度和重力加速度,问岛屿被炸了多少 题解:算出来岛屿落地位置,再利用圆与凸多边形面积交 #include&l ...
- BZOJ 4771 主席树+倍增+set
思路: 因为有深度的限制,并且我们是在线段树上维护权值,所以我们把点按照dep排序,然后一个一个修改...主席树的下标就是dfs序,子树的查询就是区间查询... 但是发现这样怎么去维护LCA呢...因 ...
- Aspose.cell中的Excel模板导出数据
//Excel模板导数据(Eexcel中根据DataTable中的个数,给多个Sheet中的模板赋值) public void DataSetToManyExcel(string fileName, ...
- DataGridView属性设置汇总
1.标题列居中 外观 ColumnHeadersDefaultCellStyle - Alignment - MiddleCenter 2.表格内容居中 外观 DefaultCellStyle - ...
- ES: 机器学习、专家系统、控制系统的数学映射
一.基本定义 1.机器学习维基定义:机器学习有下面几种定义: "机器学习是一门人工智能的科学,该领域的主要研究对象是人工智能,特别是如何在经验学习中改善具体算法的性能". & ...
- BigDataMini导论
Q: BigDataMini从大量数据中挖掘有用的信息,对AI有何意义? A: 随着智能硬件化,DataMini可以作为AI的一种数据筛选方法,简化AI的设计进程.
- Windows各种计时器
(一):OnTimer类 1.打开对应对话框的类向导ClassWizard. 2.在消息映射MessageMaps中添加消息Message:WM_TIMER. 3.程序代码中将自动添加函数OnTime ...
- 『转』The Beginning of your Design Career
想想,如果明天我开始学日语,坚持到毕业,其实也可以日语入门了.所以机会都是抓住,当初,也就是去年的时候,我那个时候就开始坚持日语入门,想想现在应该可以开始N2了吧-所以...过去不去理会,现在开始继续 ...
- apiCloud组件:swiper
一.apicloud中基于swiper封装了一个模块供调用.就是swiper.js 页面引入js就行 <script type="text/javascript" src=& ...