常见的编码
  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. CodeForces 131C C (组合)

    There are n boys and m girls attending a theatre club. To set a play "The Big Bang Theory" ...

  2. CodeForces--621A--Wet Shark and Odd and Even(数学水题)

    Wet Shark and Odd and Even Time Limit: 2000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & ...

  3. 【POJ 1830】 开关问题

    [题目链接] http://poj.org/problem?id=1830 [算法] 列出异或方程组,用高斯消元求解 [代码] #include <algorithm> #include ...

  4. 【转】iOS程序自动检测更新的实现 -- 思路不错

    原文网址:http://blog.csdn.net/davidsph/article/details/8931718 之前项目需要用到app自动更新的功能,现将实现方案分享出来.iOS程序自动提示更新 ...

  5. PDOHelper (原创)

    class PDOHelper{ public static $db =null;// new PDO('mysql:host=192.168.1.68;dbname=test','root','12 ...

  6. js设计模式-组合模式

    组合模式是一种专为创建web上的动态用户界面而量身定制的模式.使用这种模式,可以用一条命令在多个对象上激发复杂的或递归的行为.这可以简化粘合性代码,使其更容易维护,而那些复杂行为则被委托给各个对象. ...

  7. P1732 活蹦乱跳的香穗子

    题目描述 香穗子在田野上调蘑菇!她跳啊跳,发现自己很无聊,于是她想了一个有趣的事情,每个格子最多只能经过1次,且每个格子都有其价值 跳的规则是这样的,香穗子可以向上下左右四个方向跳到相邻的格子,并且她 ...

  8. 【原创】打印GC log

    -verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:c:/gc.log

  9. HTML 单击a标签 实现下载文件而不是浏览器打开预览

    <a d ownload class="down" title="">

  10. 提示 npm update check failed

    执行npm命令时出现以下提示 虽然不影响代码运行,但总觉得看了很碍事, 查找资料后发现是因为文件夹权限的问题, .config / configstore文件夹中包含一个文件:update-notif ...