一、str对象
a='\xe5\x93\x88\xe5\x93\x88' #字节串本身编码形式
a='哈哈'# 脚本环境编码形式a='\u54c8\u54c8'# unicode_escape编码形式str记录的是字节数组(某种编码的存储格式),至于输出到文件或是打印出来是什么格式,完全取决于其解码的编码将它解码成什么样子。
print语句将要输出的内容传给操作系统,操作系统根据系统的编码对输入的字节流进行编码,这就解释了为什么utf-8格式的字符串“哈哈”,输出的是“鍝堝搱”,因为'\xe5\x93\x88\xe5\x93\x88'用GBK去解释,其显示的出来就是“鍝堝搱”。
二、unicode对象
a=u'\u54c8\u54c8'
a=u'啊'a=u'\xb0\xa1'当将一个unicode对象传给print时,在内部会将该unicode对象进行一次转换,转换成本地的默认编码(这仅是个人猜测)
三、str和unicode对象的转换
str--->unicodestr.decode('utf-8')unicode--->str
unicode.encode('utf-8')在python中str和unicode在编码和解码过程中,如果将一个str直接编码成另一种编码,会先把str解码成unicode,采用的编码为默认编码,一般默认编码是anscii,所以在上面示例代码中第一次转换的时候会出错,当设定当前默认编码为'gbk'后,就不会出错了。
1. 对于控制台操作,只需要依次执行一下代码即可:import sysreload(sys)sys.setdefaultencoding('gbk')2. 对于脚本文件,可以在文件头书写特定编码:# coding = gbk或# -*- coding: gbk -*-也可以在Configure IDLE中设置Default Source Encoding默认编码当脚本中存在编码声明时,文件保存格式编码(Default Source Encoding)失效;否则,反之。
实例1 '\xe5\x93\x88\xe5\x93\x88'形式(UTF-8编码)显示中文
a='\xe5\x93\x88\xe5\x93\x88'# utf-8编码形式
print(a.decode('utf-8'))这里直接使用print(a)会调用系统默认编码(GBK)对输入的字节流进行编码,而这里的a是UTF-8编码的,所以会报错;而如果a是系统编码(GB2312或GBK)的形式,如:
a='\xb9\xfe\xb9\xfe'# GB2312或GBK编码形式print(a)直接使用print(a)就没问题了
如果操作文件或网页打印出来的是这种形式的,使用其编码解码就是了
实例2 '哈哈'形式显示中文
a='哈哈'
IDLE中:print(a)脚本中:print(a.decode('utf-8'))# utf-8脚本编码这里会调用脚本或IDLE默认编码对其编码、解码。
如果脚本编码为GBK或GB2312则可以直接使用:print(a) 实例3 '\u54c8\u54c8'形式显示中文a='\u54c8\u54c8'
print(a.decode('unicode_escape'))这里a是str字节串,只是其中包含unicode码,使用unicode_escape解码就是了
实例4 u'\u54c8\u54c8'
a=u'\u54c8\u54c8'
print(a)直接使用print(a)
实例5 u'\xe5\x93\x88\xe5\x93\x88'形式
a=u'\xe5\x93\x88\xe5\x93\x88'# utf-8编码
print(a.encode('raw_unicode_escape').decode('utf-8')) 其实,a.encode('raw_unicode_escape')将其转换为'\xe5\x93\x88\xe5\x93\x88',同实例1:这里直接使用print('\xe5\x93\x88\xe5\x93\x88')会调用系统默认编码(GBK)对输入的字节流进行编码,而如果a是GB2312或GBK编码的,直接print即可。如:c=u'\xb9\xfe\xb9\xfe'# gbk编码形式
print(c.encode('raw_unicode_escape'))
实例6 u'哈哈'形式
a=u'哈哈'
IDLE中:print(a.encode('raw_unicode_escape'))脚本中:print(a)存储形式为u'\u554a'(脚本:参照实例4)或u'\xb0\xa1'(IDLE:参照实例5)。