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 转为gb23121
2
3
4# -*- coding=UTF-8 -*-
if __name__ == '__main__':
s = u'中国'
s_gb = s.encode('gb2312')
utf-8 转为unicode1
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转为unicode1
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
2import chardet
chardet.detect(rawdata)
需要注意的是p2,p3在编码上有差别
p2的bytes是str,p3bytes,str混用会报错
字符串和bytes之间的转换:1
2
3
4
5
6
7if __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)