python 中文编码问题

一、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--->unicode
str.decode('utf-8')

unicode--->str
unicode.encode('utf-8')

在python中str和unicode在编码和解码过程中,如果将一个str直接编码成另一种编码,会先把str解码成unicode,采用的编码为默认编码,一般默认编码是anscii,所以在上面示例代码中第一次转换的时候会出错,当设定当前默认编码为'gbk'后,就不会出错了。
1. 对于控制台操作,只需要依次执行一下代码即可:
import sys
reload(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)。

 

 

 

posted on 2014-04-27 11:04  SpringStudio  阅读(1395)  评论(0编辑  收藏  举报

导航