python2 编码问题详解
实例对比
| 定义 | type | str | unicode | encode('utf8') | decode('utf8') | encode('unicode-escape') | encode('string-escape') | 编码推测 | |
|---|---|---|---|---|---|---|---|---|---|
| a='中' | str | '\x??\x??' | 报错 | 正常 | 报错 | 报错 | 报错 | '\\x??\\x??' | ascii |
| a=u'中' | unicode | 报错 | u'\u????' | 正常 | '\x??\x??\x??' | 报错 | '\\u????' | 报错 | unicode |
ascii --> unicode --> utf-8
- ascii:最早的,容量最小的编码方式。1个字节表示一个字符。
- unicode:加入多国字符,一般是2个字节表示一个字符,偏僻字用4个字节。缺点:浪费存储空间。
- utf-8:为了解决浪费空间的问题,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。
在计算机内存中,统一使用Unicode编码。当需要保存到硬盘或者需要传输的时候,可以转换为UTF-8编码。
1.Python的诞生比Unicode标准发布的时间还要早,所以最早的Python只支持ASCII编码
查看默认编码
>>> import sys
>>> sys.getdefaultencoding()
'ascii'
Python内建的ord()和chr()函数,可以把字母和对应的数字相互转换:
>>> ord('A')
65
>>> chr(65)
'A'
2.Python在后来添加了对Unicode的支持,以Unicode表示的字符串用u'...'表示
>>> u'中'
u'\u4e2d'
\u后面是十六进制的Unicode码。
3.unicode --> utf-8
>>> u'ABC'.encode('utf-8')
'ABC'
>>> u'中文'.encode('utf-8')
'\xe4\xb8\xad\xe6\x96\x87'
英文字符转换后表示的UTF-8的值和Unicode值相等(但占用的存储空间变小,2个字节变为1个字节),而中文字符转换后1个Unicode字符转化为UTF-8字符后,两个字节变为3个字节。用len()函数显示,从1个字符长度变为3个字符。
>>> len(u'中')
1
>>> len(u'中'.encode('utf-8'))
3
4.utf-8 --> unicode
>>> 'abc'.decode('utf-8')
u'abc'
>>> test = '\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
u'\u4e2d\u6587'
>>> print test
中文
5.str --> utf-8
# UTF-8无法解码str
>>> a.decode('utf8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python2710\lib\encodings\utf_8.py", line 16, in decode
return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xd6 in position 0: invalid continuation byte
# 而用GBK可以解码str
>>> t = a.decode('gbk')
>>> t
u'\u4e2d'
>>> t.encode('utf8')
'\xe4\xb8\xad'
或
>>> t = unicode(a, 'gbk') # 估计调用了decode方法
>>> t
u'\u4e2d'
>>> t.encode('utf8')
'\xe4\xb8\xad'
读取txt文件
# coding: utf-8
import os
here = os.path.dirname(__file__)
fpath = os.path.join(here, '1.txt')
with open(fpath,'r') as f:
print type(f)
ls = f.xreadlines()
print ls
for l in ls:
print l
print type(l)
结果(说明了读取文件时默认是str):
<type 'file'>
<open file 'C:\\Users\\weaming\\Desktop\\1.txt', mode 'r' at 0x05574078>
abc
<type 'str'>
中国
<type 'str'>
写入文件
with open(os.path.join(here, '2.txt'), 'w') as f:
f.write(u'abc\n中文'.encode('utf8'))
可正确写入,显示为正常的“中文”。other-->unicode-->UTF8
如何保存 .py 源代码文件
- 保存:Python源代码也是一个文本文件,所以,当你的源代码中包含中文的时候,在保存源代码时,就需要务必指定保存为UTF-8编码。
- 读取:当Python解释器读取源代码时,为了让它按UTF-8编码读取,我们通常在文件开头(第一行或第二行)写上这一行行
# -*- coding: utf-8 -*-
终极原则:decode early, unicode everywhere, encode finally
在输入或者声明字符串的时候,尽早地使用decode方法将字符串转化成unicode编码格式;然后在程序内使用字符串的时候统一使用unicode格式进行处理,比如字符串拼接、字符串替换、获取字符串的长度等操作;最后,在输出字符串的时候(控制台/网页/文件),通过encode方法将字符串转化为你所想要的编码格式,比如utf-8等。
参考链接
python2 编码问题详解的更多相关文章
- Java:编码的详解
ASCII:美国信息标准信息码,用一个字节的7为表示. ISO8859-1:拉丁码表 欧洲码表 ,用一个字节的8位表示. GB2312:中国的中文编码表. GBK:中国的中文编码表升级,融合了更多的中 ...
- python 之编码问题详解
前在一个项目中遇到用post提交一个xml,xml中含有中文,对于单独的py文件,使用urllib2.urlopen完全ok,但在django中使用就一直报编码错误,然后在网上看到这篇文章不错,决定m ...
- [转载]Python3编码问题详解
原文:Python3的编码问题 Python3 最重要的一项改进之一就是解决了 Python2 中字符串与字符编码遗留下来的这个大坑.Python 编码为什么那么蛋疼?已经介绍过 Python2 字符 ...
- LZ77压缩算法编码原理详解(结合图片和简单代码)
前言 LZ77算法是无损压缩算法,由以色列人Abraham Lempel发表于1977年.LZ77是典型的基于字典的压缩算法,现在很多压缩技术都是基于LZ77.鉴于其在数据压缩领域的地位,本文将结合图 ...
- [转]utf8编码原理详解
from : http://blog.csdn.net/baixiaoshi/article/details/40786503 很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态 ...
- php各种编码集详解和以及在什么情况下进行使用
字符是各种文字和符号的总称,包括各国家文字.标点符号.图形符号.数字等. 字符集是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,常见字符集名称:ASCII字符集.GB2312字符集.B ...
- JS编码解码详解
今天在整理 js编码解码方法时,在网上搜资料,发现一篇文章讲的不错,讲解的非常简单明了,于是乎就想转载过来,却发现无法转载到博客园,最后只能卑鄙的摘抄过来.js编码解码就是将一些对URL和数据库敏感的 ...
- crawler_URL编码原理详解
经常写爬虫的童鞋,难免要处理含有中文的url,大部分时间,都知道url_encode,各个语言也都有支持,今天简单整理下原理,供大家科普 1.特征: 如果URL中含有非ASCII字符的话, 浏览器会对 ...
- 计算机编码方式详解(Unicode、UTF-8、UTF-16、ASCII)
整理这篇文章的动机是两个问题: 问题一: 使用Windows记事本的"另存为",可以在GBK.Unicode.Unicode big endian和UTF-8这几种编码方式间相互转 ...
随机推荐
- [神器推荐]node-webkit:跨平台桌面web应用的神器,非常有用(转)
11月8号在清华拍的银杏树 http://finalshares.com/read-931
- [翻译]AlphaGO留给我们的东西
来源:http://headlines.yahoo.co.jp/hl?a=20160317-00000049-cnippou-krhttp://headlines.yahoo.co.jp/hl?a=2 ...
- 分享一个MVC的多层架构,欢迎大家拍砖斧正
如果你对项目管理.系统架构有兴趣,请加微信订阅号"softjg",加入这个PM.架构师的大家庭 多层架构是开发人员在开发过程当中面对复杂且易变的需求采取的一种以隔离控制为主的应对策 ...
- JavaScript事件小结
我们都晓得JavaScrip事件的重要性,所以下面小结一下以备后用! 序号 事件 描述 备注 onclick 鼠标点击某个对象时触发此事件 是最常用的事件之一 onchange 用户改变域的内容时 ...
- 学习联系 Java阶乘相关练习
题目一:一张纸的厚度大约是0.08mm,对折多少次之后能达到珠穆朗玛峰的高度 double hou = 0.00008; for (int i = 1; i > 0; i++) { hou = ...
- C语言 不看怎么存,只看怎么读 ,短字节长字节之间的转换
不看怎么存,只看怎么读 e.g. int a = 010; //8以8进制存 int b = 8;//8以10进制存 printf("%d %d\n",a,b); 以十进制取 a和 ...
- 关于BitmapFactory解析流的问题a
今天碰到了一个超级恶心的问题,BitmapFactory.decodeStream(bis,null,options)一直是返回NULL 问题是这样子的: InputStream is= respon ...
- 用AsyncTask 来实现下载图片在android开发中
Android使用AsyncTask 有如下好处: 1. 线程的开销较大,如果每个任务都要创建一个线程,那么应用程序的效率要低很多: 2. 线程无法管理,匿名线程创建并启动后就不受程序的控制了,如果有 ...
- 逻辑运算符||和| 、&&和&的区别
||和| .&&和&的区别 这里以&&和&为例.或与之一直 1.&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符 ...
- js 实现获取对象所有键名(key)的方法
1.for in 循环 并且使用hasOwnProperty 方法 var jsonObject1 = { "name": "xiaoming", " ...