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 ...
随机推荐
- Linux下实现视频读取
V4L(video4linux是一些视频系统,视频软件.音频软件的基础,经常时候在需要采集图像的场合,如视频监控,webcam,可视电话,经常使用在embedded linux中是linux嵌入式开发 ...
- html中map标签和area标签的应用
map标签的用途:是与img标签绑定使用的,常被用来赋予给客户端图像某处区域特殊的含义,点击该区域可跳转到新的文档. 因为map标签是与img标签绑定使用的,所以我们需要给map标签添加ID和name ...
- spring中quatz的多定时任务配置图文详解
近来公司让用quatz框架做定时功能,而且还是执行多定时任务,真是苦恼. 虽然从网上搜了很多资料,但是写法上不太尽如人意,最后还是请教了螃蟹大神,给的配置建议就是简单啊,现在拿来分享下: 这里我们需要 ...
- 用JS解决Asp.net Mvc返回JsonResult中DateTime类型数据格式的问题
当用ajax异步时,返回JsonResult格式的时候,发现当字段是dateTime类型时,返回的json格式既然是“/Date(1435542121135)/” 这样子的,当然这不是我们想要的格式. ...
- css3动画,点击圆形背景扩展整个页面效果
上次做项目的时候,要求点击链接,这个链接的圆形背景扩散充满整个页面,今天把这个效果整理一下,是简单的css3的动画特效,粘贴下面的代码看效果 <!DOCTYPE html> <htm ...
- Python笔记22-----高阶函数
1.sorted(排序对象,key=):排序对象可以是类别,也可以是字符串和字典,key为自定义排序,如:[key=abs,按绝对值排序][key=lambda x:x[1],按排序对象的第二个值排序 ...
- 【BZOJ4864】【BJWC2017】神秘物质 - Splay
题意: Description 21ZZ 年,冬.小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微观粒子.这一天, 小诚刚从研究所得到了一块奇异的陨石样本, ...
- 重置浏览器默认样式 normalize.css
1 /*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ /* Document ========= ...
- 会话cookie和持久化cookie实现session
当你第一次访问一个网站的时候,网站服务器会在响应头内加上Set- Cookie:PHPSESSID=nj1tvkclp3jh83olcn3191sjq3(php服务器),或Set-Cookie JSE ...
- EhCache缓存页面、局部页面和对象缓存
页面缓存:SimplePageCachingFilter web.xml <!-- 页面缓存配置,配合ehcache.xml中name为“SimplePageCachingFilter”(默认值 ...