字符编码
a.ASCII(American Standard Code for Information Interchange)是单字节编码(256)。
b.MBCS(Multi-Byte Character Set)由于单字节编码ASCII无法满足各种语言的需要,出现了多字节编码(Bigxx,GBKxxx)。
c.Unicode由于多种编码的出现,使得编码变得复杂,于是出现了统一编码。
d.Unicode详细说明(摘自:Python字符编码详解)
- 最初的Unicode标准UCS-2使用两个字节表示一个字符,所以你常常可以听到Unicode使用两个字节表示一个字符的说法。但过了不久有人觉得256*256太少了,还是不够用,于是出现了UCS-4标准,它使用4个字节表示一个字符,不过我们用的最多的仍然是UCS-2。
- UCS(Unicode Character Set)还仅仅是字符对应码位的一张表而已,比如"汉"这个字的码位是6C49。字符具体如何传输和储存则是由UTF(UCS Transformation Format)来负责。
- 一开始这事很简单,直接使用UCS的码位来保存,这就是UTF-16,比如,"汉"直接使用\x6C\x49保存(UTF-16-BE),或是倒过来使用\x49\x6C保存(UTF-16-LE)。但用着用着美国人觉得自己吃了大亏,以前英文字母只需要一个字节就能保存了,现在大锅饭一吃变成了两个字节,空间消耗大了一倍……于是UTF-8横空出世。
- UTF-8是一种很别扭的编码,具体表现在他是变长的,并且兼容ASCII,ASCII字符使用1字节表示。然而这里省了的必定是从别的地方抠出来的,你肯定也听说过UTF-8里中文字符使用3个字节来保存吧?4个字节保存的字符更是在泪奔……(具体UCS-2是怎么变成UTF-8的请自行搜索)
- 另外值得一提的是BOM(Byte Order Mark)。我们在储存文件时,文件使用的编码并没有保存,打开时则需要我们记住原先保存时使用的编码并使用这个编码打开,这样一来就产生了许多麻烦。(你可能想说记事本打开文件时并没有让选编码?不妨先打开记事本再使用文件 -> 打开看看)而UTF则引入了BOM来表示自身编码,如果一开始读入的几个字节是其中之一,则代表接下来要读取的文字使用的编码是相应的编码:
BOM_UTF8 '\xef\xbb\xbf'
BOM_UTF16_LE '\xff\xfe'
BOM_UTF16_BE '\xfe\xff'
- 并不是所有的编辑器都会写入BOM,但即使没有BOM,Unicode还是可以读取的,只是像MBCS的编码一样,需要另行指定具体的编码,否则解码将会失败。
- 你可能听说过UTF-8不需要BOM,这种说法是不对的,只是绝大多数编辑器在没有BOM时都是以UTF-8作为默认编码读取。即使是保存时默认使用ANSI(MBCS)的记事本,在读取文件时也是先使用UTF-8测试编码,如果可以成功解码,则使用UTF-8解码。记事本这个别扭的做法造成了一个BUG:如果你新建文本文件并输入"姹塧"然后使用ANSI(MBCS)保存,再打开就会变成"汉a",你不妨试试 .
Python编码问题
对Unicde进行解码和对str进行编码都是错误的,尽管python并不会报错。
#coding:utf-8
import sys
string = "好人"
print sys.getdefaultencoding() #utf-8
print len(string) #6
print len(string.decode("UTF-8")) #2
文件头部编码声明
#coding:utf-8
声明的编码必须与文件实际保存时用的编码一致,否则很大几率会出现代码解析异常
Python编码总结
编码建议
A.使用字符编码,在同一个工程中使用同一种编码
B.抛弃str,全部使用Unicode
C.用codecs.open()代替open()
D.避免的字符:MBCS、DBCS、UTF-16
在python中,将字符串由一种编码转换为另一种编码,需要先将其解码成unicode后,再将unicode编码成指定的编码(python内部使用的编码格式是unicode)。
#!/usr/bin/env python
#coding=utf-8
#通用的方法
s="中文"
if isinstance(s, unicode): #用于判断字符串是否为unicode编码
s=u"中文"
print s.encode('gb2312')
else:
s="中文"
print s.decode('utf-8').encode('gb2312')
参考链接
http://www.cnblogs.com/huxi/archive/2010/12/05/1897271.html
http://blog.chinaunix.net/uid-25063573-id-3033365.html