常见的编码
  ASCII: 美国人发明的,只编码英文字母和符号,1个字节。
  GB2312: 中国人发明的,增加了中文汉字和符号,2个字节。
  Unicode: 为了把所有语言都统一到一套编码里,一般是2个字节,生僻字4个字节。
  UTF-8: 为了节省英文字符内存空间,UTF-8可变长编码,常用的英文字母被编码成1个字节,汉字通常是3个字节,生僻的字符编码成4-6个字节。

  1. >>> S = '中文'
  2. >>> print type(S), len(S)
  3. <type 'str'> 4
  4.  
  5. >>> unicodeS = u'中文'
  6. >>> print type(unicodeS), len(unicodeS)
  7. <type 'unicode'> 2
  8.  
  9. >>> utfS = u'中文'.encode('utf-8')
  10. >>> print type(utfS), len(utfS)
  11. <type 'str'> 6

  在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码,这样可以节省很多存储空间。

   其中,python2和python3系统默认编码分别是ascii和utf-8,以python2.7为例:

  1. >>> import sys
  2. >>> sys.getdefaultencoding()
  3. 'ascii'
  4.  
  5. >>> a = 'hello'
  6. >>> print type(a)
  7. <type 'str'>
  8. >>> b = a.decode('ascii')
  9. >>> print type(b)
  10. <type 'unicode'>
  11. >>> c = a.decode('ascii').encode('utf-8')
  12. >>> print type(c)
  13. <type 'str'>

  然而python2.7中,比较麻烦的还是有两种数据模型来支持字符串这种数据类型,str和unicode(python3改进后只有unicode一种),比如s = '中文'就是str类型的字符串,而u=u"中文"就是一个unicode类型的字符串。unicode是由str类型的字符串解码后得到,unicode也可以编码成str类型。即

  1.   str --> decode -->unicode
  2.   unicode --> encode --> str

  在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。
  注:Unicode 格式:像\u0000;二进制编码 格式:像\x00\x00,其中utf-8,gbk就是二进制编码;

  1. >>> s1 = u'中文'
  2. >>> type(s1)
  3. <type 'unicode'>
  4. >>> s2 = 'ABC'
  5. >>> type(s2)
  6. <type 'str'>
  7.  
  8. #字符串转码成unicode对象
  9. >>> u'ABC'
  10. u'ABC'
  11. >>> u'中文'
  12. u'\u4e2d\u6587'
  13.  
  14. #英文字符串编码成utf8格式
  15. >>> 'ABC'.encode('utf-8')
  16. 'ABC'
  17. >>> u'ABC'.encode('utf-8')
  18. 'ABC'
  19.  
  20. #中文字符串需先转码成unicode,再编码成utf8格式
  21. >>> '中文'.encode('utf-8')
  22.  
  23. Traceback (most recent call last):
  24. File "<pyshell#15>", line 1, in <module>
  25. '中文'.encode('utf-8')
  26. UnicodeDecodeError: 'utf8' codec can't decode byte 0xd6 in position 0: invalid continuation byte
  27.  
  28. >>> u'中文'.encode('utf-8')
  29. '\xe4\xb8\xad\xe6\x96\x87'
  30. >>> u'\u4e2d\u6587'.encode('utf-8')
  31. '\xe4\xb8\xad\xe6\x96\x87'
  32.  
  33. #字符串从utf8格式解码成unicode
  34. >>> 'ABC'.decode('utf-8')
  35. u'ABC'
  36. >>> '\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
  37. u'\u4e2d\u6587'
  38. >>> print '\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
  39. 中文

  编码检验和转换

  1. #检查编码
  2. >>> import urllib
  3. >>> rawdata = urllib.urlopen('http://www.google.cn/').read()
  4. >>> import chardet
  5. >>> chardet.detect(rawdata)
  6. {'confidence': 0.99, 'encoding': 'utf-8'}
  7.  
  8. #将String对象从UTF-8内码转换为gbk,相反则s.decode('gbk').encode('utf-8')
  9. >>> rawdata.decode('utf-8').encode('gbk')
  10.  
  11. #以unicode为中介实现编码或解码
  12. >>> u'中文'.encode('gbk')
  13. '\xd6\xd0\xce\xc4'
  14. >>> u'中文'.encode('utf-8')
  15. '\xe4\xb8\xad\xe6\x96\x87'
  16. >>> '\xd6\xd0\xce\xc4'.decode('gbk')
  17. u'\u4e2d\u6587'
  18. >>> print u'\u4e2d\u6587'
  19. 中文
  20. >>> '\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
  21. u'\u4e2d\u6587'
  22. >>> print u'\u4e2d\u6587'
  23. 中文

其中,decode的函数原型是 decode([encoding], [errors='strict']),可以用第二个参数控制错误处理的策略。

   默认的参数就是strict,代表遇到非法字符时抛出异常;
     如果设置为ignore,则会忽略非法字符;
     如果设置为replace,则会用?取代非法字符;

读写文件编码

  以test.txt文件为例,文件内容为“测试”。

  1. >>> #coding=utf-8
  2. >>> f = open("test.txt")
  3. >>> s = f.read()
  4. >>> print type(s)
  5. <type 'str'>
  6. >>> s
  7. '\xb2\xe2\xca\xd4'
  8. >>> u = s.decode("gbk")
  9. >>> u
  10. u'\u6d4b\u8bd5'
  11. >>> f.write(u.encode("utf-8"))
  12. >>> print u
  13. 测试

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. Linux下实现视频读取

    V4L(video4linux是一些视频系统,视频软件.音频软件的基础,经常时候在需要采集图像的场合,如视频监控,webcam,可视电话,经常使用在embedded linux中是linux嵌入式开发 ...

  2. html中map标签和area标签的应用

    map标签的用途:是与img标签绑定使用的,常被用来赋予给客户端图像某处区域特殊的含义,点击该区域可跳转到新的文档. 因为map标签是与img标签绑定使用的,所以我们需要给map标签添加ID和name ...

  3. spring中quatz的多定时任务配置图文详解

    近来公司让用quatz框架做定时功能,而且还是执行多定时任务,真是苦恼. 虽然从网上搜了很多资料,但是写法上不太尽如人意,最后还是请教了螃蟹大神,给的配置建议就是简单啊,现在拿来分享下: 这里我们需要 ...

  4. 用JS解决Asp.net Mvc返回JsonResult中DateTime类型数据格式的问题

    当用ajax异步时,返回JsonResult格式的时候,发现当字段是dateTime类型时,返回的json格式既然是“/Date(1435542121135)/” 这样子的,当然这不是我们想要的格式. ...

  5. css3动画,点击圆形背景扩展整个页面效果

    上次做项目的时候,要求点击链接,这个链接的圆形背景扩散充满整个页面,今天把这个效果整理一下,是简单的css3的动画特效,粘贴下面的代码看效果 <!DOCTYPE html> <htm ...

  6. Python笔记22-----高阶函数

    1.sorted(排序对象,key=):排序对象可以是类别,也可以是字符串和字典,key为自定义排序,如:[key=abs,按绝对值排序][key=lambda x:x[1],按排序对象的第二个值排序 ...

  7. 【BZOJ4864】【BJWC2017】神秘物质 - Splay

    题意: Description 21ZZ 年,冬.小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微观粒子.这一天, 小诚刚从研究所得到了一块奇异的陨石样本, ...

  8. 重置浏览器默认样式 normalize.css

    1 /*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ /* Document ========= ...

  9. 会话cookie和持久化cookie实现session

    当你第一次访问一个网站的时候,网站服务器会在响应头内加上Set- Cookie:PHPSESSID=nj1tvkclp3jh83olcn3191sjq3(php服务器),或Set-Cookie JSE ...

  10. EhCache缓存页面、局部页面和对象缓存

    页面缓存:SimplePageCachingFilter web.xml <!-- 页面缓存配置,配合ehcache.xml中name为“SimplePageCachingFilter”(默认值 ...