python编码问题

字符编码

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是一种很别扭的编码,具体表现在他是变长的,并且兼容ASCIIASCII字符使用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,但即使没有BOMUnicode还是可以读取的,只是像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.避免的字符:MBCSDBCSUTF-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

你可能感兴趣的:(python编码问题)