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 ...
随机推荐
- [BZOJ 3363] Cow Marathon
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=3363 [算法] 树的直径 [代码] #include<bits/stdc++. ...
- [Hacker] 端口大全
一 .端口大全 端口:0 服务:Reserved 说明:通常用于分析操作系统.这一方法能够工作是因为在一些系统中“0”是无效端口,当你试图使用通常的闭合端口连接它时将产生不同的结果.一种典型的扫描,使 ...
- 4、Collection接口功能测试(所有的All方法)
package cn.itcast_01; import java.util.ArrayList; import java.util.Collection; /* * 所有带All的方法:(听完就忘) ...
- WinForm进程 线程
进程主要调用另一程序,线程 分配工作. 一.进程: 进程是一个具有独立功能的程序关于某个数据集合的一次运行活动.它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体.Process 类,用来操 ...
- oracle11g安装与拆卸
Oracle 11g安装 1.解压下载的包,然后进入包内,点击setup.exe开始安装 . 2.出现如下:一般把那个小对勾取消,点击下一步进行, 弹出下图这个后点'是' 3.下图后,选择创建和配置数 ...
- video相关简单的api
video 关键api 1. video.pause() 2. video.play() 3. video.webkitRequestFullScreen() //全屏 4. video.curren ...
- Splash Screen(短时间弹出框,信息显示一次)
原文引自codeproject site, http://www.codeproject.com/Articles/6511/Transparent-Splash-Screen 1.A splash ...
- 5 Python+Selenium的元素定位方法(xpath)
[环境] Python3.6+selenium3.0.2+FireFox50+win7 [定位方法] 1.方法:find_element_by_xpath('') 说明:xpath定位方法有相对路径和 ...
- UVa1585修改版
#include<stdio.h> int main() { int i,k=-1; char a[100]; while(scanf("%s",&a)!=EO ...
- getopt_long 函数
getopt_long, getopt_long_only -- 命令行解析函数,支持长选项解析 [说明]getopt_long/getopt_long_only是getopt的泛集,getopt ...