一、python有两种字符串类型:str和unicode
1、str:常用的字符集如:gb2312、gb18030/gbk、utf-8、ascii,这些都是字符的二进制(字节)编码形式
2、unicode:Python 认为 16 位的 unicode 才是字符的唯一内码
3、encode:从unicode转换成二进制编码,即从unicode转换成str
4、decode:从二进制编码转换成unicode
5、在进行同时包含str与unicode的运算时,Python一律都把str转换成unicode再运算,当然,运算结果也都是unicode。
6、建议在
python代码
# -*- coding: utf-8 -*-
#第一行表明python代码由utf-8编码
#-----------------------------------------1----------------------------------------
s='我是谁' #这是个str的字符串,是utf-8字符串
u=u'我是谁' #这是个unicode字符串
s.decode('utf-8') #从str转成unicode,即用utf-8解码字符串s
u.encode('utf-8') #从unicode转成str,即将unicode码按utf-8编码成字符串
s.decode('ascii') #错误,用ascii解码utf-8字符串
s.decode('gbk') #不出错,但出现乱码
u.encode('ascii') #错误,中文无法用ascii字符集编码
u.encode('gbk') #不出错,但会出现乱码
#-----------------------------------------2------------------------------------------
#注意一:在进行同时包含str与unicode的运算时,Python一律都把str转换成unicode再运算,当然,运算结果也都是unicode。
"中文:%s" % s # 正确,所有的字符串都是 str, 不需要 decode
"中文:%s" % u # 失败,相当于运行:"中文:%s".decode('ascii') % u ,为什么是ascii,因为sys.getdefaultencoding()默认是ascii
import sys
reload(sys) # reload 才能调用 setdefaultencoding 方法
sys.setdefaultencoding('utf-8') # 设置 'utf-8',这个是全局的,对当前程序运行的所有python代码都起作用
#若 linux的$LANG为zh_CN.GBK,则print s输出到终端时会出现乱码,但print u输出到终端不会乱码,会将u按$LANG的字符集编码
参考:https://in355hz.iteye.com/blog/1860787