常见的编码
  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编码与解码的更多相关文章

  1. Python2/3的中、英文字符编码与解码输出: UnicodeDecodeError: 'ascii' codec can't decode/encode

    摘要:Python中文虐我千百遍,我待Python如初恋.本文主要介绍在Python2/3交互模式下,通过对中文.英文的处理输出,理解Python的字符编码与解码问题(以点破面). 前言:字符串的编码 ...

  2. 关于Python2字符编码的体会

    对于Python的字符编码问题也懵了很久,最近做爬虫多次遇到网页转码的问题,干脆彻底解决掉!Just Do it! 1.两种类型str与unicode str和unicode都是basestring的 ...

  3. python3中的编码与解码(超好理解)

    编码和解码是针对数据而言的,数据能干什么呢?无非就是用来显示,储存和传输的: 储存和传输数据当然是希望数据越小越好,所以发明了utf-8这种数据编码显示:它智能将英文用一个字节表示,欧洲的字符用两个字 ...

  4. Day5 Pyhton基础之编码与解码(四)

    1.编码与解码 1.1现在常用的编码类型

  5. URL地址编码和解码

    0. 参考 [整理]关于http(GET或POST)请求中的url地址的编码(encode)和解码(decode) python3中的urlopen对于中文url是如何处理的? 中文URL的编码问题 ...

  6. Python基础-编码与解码

      一.什么是编码 编码是指信息从一种形式或格式转换为另一种形式或格式的过程. 在计算机中,编码,简而言之,就是将人能够读懂的信息(通常称为明文)转换为计算机能够读懂的信息.众所周知,计算机能够读懂的 ...

  7. python2.X编码

    1.Python文件的编码 在Python文件中,可以在第一或第二行指定文件的编码格式(以注释的形式加),这也是Python语法规定的,见http://www.python.org/peps/pep- ...

  8. 【转】python基础-编码与解码

    [转自:https://www.cnblogs.com/OldJack/p/6658779.html] 一.什么是编码 编码是指信息从一种形式或格式转换为另一种形式或格式的过程. 在计算机中,编码,简 ...

  9. python学习笔记09-python编码与解码

    二进制编码: --->ASCII:只能存英文和拉丁字符 一个字符占一个字节:8位 ------>gb2312:只能存6700多个中文: 1980年发表 ----------->gbk ...

随机推荐

  1. 辨异 —— Java 中的抽象类和接口

    接口优于抽象类.-- <Effective Java>(Item 18) 0. 语法区别 抽象类允许给出某些方法的实现,接口不允许: 为了实现由抽象类定义的类型(type),类必须成为抽象 ...

  2. Hdu-2892 area 计算几何 圆与凸多边形面积交

    题面 题意:有一个凸多边形岛屿,然后告诉你从高空(x,y,h)投下炸弹,爆炸半径r,飞机水平速度和重力加速度,问岛屿被炸了多少 题解:算出来岛屿落地位置,再利用圆与凸多边形面积交 #include&l ...

  3. BZOJ 4771 主席树+倍增+set

    思路: 因为有深度的限制,并且我们是在线段树上维护权值,所以我们把点按照dep排序,然后一个一个修改...主席树的下标就是dfs序,子树的查询就是区间查询... 但是发现这样怎么去维护LCA呢...因 ...

  4. Aspose.cell中的Excel模板导出数据

    //Excel模板导数据(Eexcel中根据DataTable中的个数,给多个Sheet中的模板赋值) public void DataSetToManyExcel(string fileName, ...

  5. DataGridView属性设置汇总

    1.标题列居中 外观  ColumnHeadersDefaultCellStyle - Alignment - MiddleCenter 2.表格内容居中 外观  DefaultCellStyle - ...

  6. ES: 机器学习、专家系统、控制系统的数学映射

    一.基本定义    1.机器学习维基定义:机器学习有下面几种定义: "机器学习是一门人工智能的科学,该领域的主要研究对象是人工智能,特别是如何在经验学习中改善具体算法的性能". & ...

  7. BigDataMini导论

    Q: BigDataMini从大量数据中挖掘有用的信息,对AI有何意义? A: 随着智能硬件化,DataMini可以作为AI的一种数据筛选方法,简化AI的设计进程.

  8. Windows各种计时器

    (一):OnTimer类 1.打开对应对话框的类向导ClassWizard. 2.在消息映射MessageMaps中添加消息Message:WM_TIMER. 3.程序代码中将自动添加函数OnTime ...

  9. 『转』The Beginning of your Design Career

    想想,如果明天我开始学日语,坚持到毕业,其实也可以日语入门了.所以机会都是抓住,当初,也就是去年的时候,我那个时候就开始坚持日语入门,想想现在应该可以开始N2了吧-所以...过去不去理会,现在开始继续 ...

  10. apiCloud组件:swiper

    一.apicloud中基于swiper封装了一个模块供调用.就是swiper.js 页面引入js就行 <script type="text/javascript" src=& ...