常见的编码
  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. HDU1412 {A} + {B}

    2019-05-17 10:15:01 每个元素之间有一个空格隔开. 每行最后一的元素后面没有空格,区别于HDU人见人爱A - B 注意使用STL的时候要清空 .  a.clear(); #inclu ...

  2. 11g Rac PSU20180116手动补丁升级步骤

    手动升级:软件包解压在新建的/home/grid/update 目录下ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1GRID_HOME=/u01 ...

  3. LeetCode.888-公平的糖果交换(Fair Candy Swap)

    这是悦乐书的第339次更新,第363篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第208题(顺位题号是888).Alice和Bob有不同大小的糖果棒:A[i]是Alic ...

  4. MyBatis输出执行的SQL到控制台

    src\main\resources\application.properties 或者src\main\resources\application.yml 在你的application.proper ...

  5. swi prolog 与c#

    最近,玩了一下prolog语言,感觉还是很有意思.由于我是学c#的,所以就不禁想看看c#如何与prolog进行结合,在网上找了一下,发现有个swi prolog对c#的dll,下载官网:http:// ...

  6. Teamwork-六月上旬心得体会

    六月上旬心得体会 在五月末的时候,老师针对我们团队的状况提出了几点建议和解决方案,而这半个月里,我们尝试性地运用了其中的几件工具与方法. 1.燃尽图与每日总结 我们采用的是<构建之法>书中 ...

  7. iOS中容易混淆的知识点(持续更新中)

    1.成员变量和属性的区别 @interface Person : NSObject { NSString *_sex; } @property (nonatomic, copy) NSString * ...

  8. UWP Ad

    1.对于 UWP 应用:使用 Visual Studio 2015 安装 Microsoft Store Services SDK 2.对于通用 Windows 平台 (UWP) 项目:展开通用 Wi ...

  9. 六星经典CSAPP笔记系列 - 作者:西代零零发

    六星经典CSAPP笔记(1)计算机系统巡游 六星经典CSAPP笔记(2)信息的操作和表示 六星经典CSAPP-笔记(3)程序的机器级表示

  10. Java为什么需要基本类型

    提问 首先抛出问题吧:Java为什么需要基本类型? 最开始遇到这个问题的场景不记得了,但是一查之下,发现一个问题:Java既然是面向对象的,宣称一切都是对象,为什么还有基础类型. 先上结论 为了性能+ ...