python编码问题

python中的编码和解码

python中的字符串

1.python 有两种字符串类型:str和unicode
2.str转换成特定编码类型,需要把str转为Unicode,然后由unicode转为特定编码。

unicode和utf-8的区别

utf-8用1-8个字节来保存unicode编码的字符。unicode编码字符集,utf-8字符集编码(编码规则)。

字符集:为每一个字符分配唯一的ID(学名码位)

编码规则:将字符转为字节序列

unicode字符集为每一个字符分配了一个码位,例如「知」的码位是 30693,记作 U+77E5(30693 的十六进制为 0x77E5)。
UTF-8 顾名思义,是一套以 8 位为一个编码单位的可变长编码。会将一个码位编码为 1 到 4 个字节(变长编码方式)

上代码更直观

unicode 转为gb2312

1
2
3
4
# -*- coding=UTF-8 -*-
if __name__ == '__main__':
s = u'中国'
s_gb = s.encode('gb2312')

utf-8 转为unicode

1
2
3
4
5
6
#coding=UTF-8
if __name__ == '__main__':
s = u'中国'
#s为unicode先转为utf-8
s_utf8 = s.encode('UTF-8')
assert(s_utf8.decode('utf-8') == s)

普通的str转为unicode

1
2
3
4
5
6
7
8
9
10
#coding=UTF-8
if __name__ == '__main__':
s = '中国'
su = u'中国''
#s为unicode先转为utf-8
#因为s为所在的.py(# -*- coding=UTF-8 -*-)编码为utf-8
s_unicode = s.decode('UTF-8')
assert(s_unicode == su)
#s转为gb2312:先转为unicode再转为gb2312
s.decode('utf-8').encode('gb2312')

python 编码检测

1
2
import chardet
chardet.detect(rawdata)

需要注意的是p2,p3在编码上有差别
p2的bytes是str,p3bytes,str混用会报错
字符串和bytes之间的转换:

1
2
3
4
5
6
7
if __name__ == '__main__':
s = u'中国'
#s为unicode先转为utf-8
s_utf8 = s.encode('gb2312')
print(s_utf8)
print(str(s_utf8,encoding='gb2312'))
# assert(s_utf8.decode('utf-8') == s)