总是把python的编码问题搞得很混乱,现在整理一下,免得以后再忘记。。。

常见字符编码

常见的字符编码有 ASCII 编码,GBK 编码,Unicode 编码和 UTF-8 编码等等。
ASCII编码是最开始美国使用的,一个字节(八个位)代表一个字符。比如大写英文字母 A 的二进制表示是 01000001(十进制 65)。
Unicode编码的出现原因是ASCII编码推向全球时,一个字节不能完成所有国家字符的表示,所以需要更多的字节来表示一个字符。Unicode统一使用多个字节表示一个字符必然会造成资源的浪费,所以UTF-8就出现了。
UTF-8 (8-bit Unicode Transformation Format) 是一种针对 Unicode 的可变长度字符编码,它使用一到四个字节来表示字符,例如,ASCII 字符继续使用一个字节编码,阿拉伯文、希腊文等使用两个字节编码,常用汉字使用三个字节编码,等等。

python的编码问题

Python2 的默认编码是 ascii,Python3 的默认编码是 utf-8,可以通过下面的方式获取:

python2的编码问题

Python2 中有两种和字符串相关的类型:str 和 unicode,它们的父类是 basestring。其中,str 类型的字符串有多种编码方式,默认是 ascii,还有 gbk,utf-8 等,unicode 类型的字符串使用 u’…’ 的形式来表示,下面的图展示了 str 和 unicode 之间的关系:

python a|b pythonA编码_字符串


所以一般的字符串的编码类型的转换就是在str和unicode之间进行转换

decode(‘utf-8’)表示解码utf-8,使其编码类型为unicode

encode(‘utf-8’)表示编码成utf-8,使其编码类型为utf-8

>>> '中文'.decode('utf-8') #将‘中文’解码成unicode
u'\u4e2d\u6587'
>>> u'中文'.encode('utf-8') #将中文编码成utf-8
'\xe4\xb8\xad\xe6\x96\x87'

所以decode和encode一般只用于unicode和utf-8之间的转换,当涉及到str内的编码类型转换时,需要使用unicode作为媒介,如

s='中国'  #gbk
n=s.decode('gbk')  #这里将gbk转成了unicode
m=n.encode('utf-8') #再将unicode转成utf-8

我们常加的开头干啥的

#coding=utf-8

这个东西是干啥的呢?
python的脚本文件默认编码都是ASCII,当我们在脚本中出现ASCII码无法表达的字符时,咋办?比如脚本中出现中文。这时就需要上面这行代码告诉脚本,这个中文你ASCII搞不定,那我用utf-8吧,这样就不会报错了。当然,也可以用gbk等编码方式。

import sys
reload (sys)
sys.setdefaultencoding('utf-8)

上面这个又是干啥的?
前面我们讲了,当进行str类型转换时,需要使用unicode作为媒介,先解码成unicode,再编码成相应的str类型:

#coding=utf-8
s='中国' #因为设置了#coding=utf-8,所以s的类型是utf-8
s_gbk=s.decode('utf-8').encode('gbk')#这里就是先将utf-8转成unicode,再转成gbk

那如果直接encode(‘gbk’)行不行?
直接这样做是不行的,因为如果执行s_gbk=s.encode(‘gbk’),这里python会默认先将s解码成unicode,但是python默认编码是ASCII,所以在不适用decode(‘utf-8’)的情况下,python会认为s是ASCII,所以会默认执行s.decode(‘ascii’),但是我们知道s的类型是utf-8,所以这里就会报错啦。
因此想省事的话,sys.setdefaultencoding(‘utf-8’)就会告诉python,这里的s是utf-8,别给我当成ascii,这样的话,直接执行s.encode(‘gbk’)就可以啦。

print的问题

对于windows来说,print一个中文字符,需要将中文字符转成unicode。