常用的中文编码主要有gbk和utf8两种格式。比如:windows平台默认是gbk编码,android平台默认是utf8。
显示包含中文字符串的时候,如果字符串的实际编码格式与显示模块当前使用的编码格式不一致的话,有可能
出现乱码的现象。(不一定出现,是因为有的字符串,gbk和utf8两种编码格式下的字节数据是一样的)
而要能在不同的平台下正确的显示包含中文的字符串,就需要将输入的字符串,编码成平台默认的编码格式。
一般流程是:先转成unicode,然后由unicode转成目标编码格式。
但是,很多时候,我们预先并不知道输入的字符串是什么编码。比如,我们在windows平台下,使用文件资源管理
器创建的中文名称的文件,使用的gbk编码。同时也可以使用python以utf8编码在同一目录下,创建另外一个中文名称
的文件。当我们使用类似‘ls’的命令去列出该目录下的内容时,由于包含了两种不同的编码,如果以明确的一种编码去
显示,可能会出现乱码的现象。
为解决上述,两种(加上unicode编码就是三种)混合输入显示乱码的问题,常见的解决的思路是:将所有的输入全部
转成同一个的编码格式(目前只支持gbk、utf8),然后再输出或者显示出来。
以下是使用python实现的一个方案:
(该项目的源码路径:https://github.com/SanYuanAndy/python下的code.py文件)
#coding=utf8
#中文乱码的原因是显示模块使用的编码与字符串实际的编码不一致
#解决中文乱码的方法是:1、明确显示模块的编码方式。2、将字符串转成与显示模块编码一致
#一般是先转成unicode、然后再转成目标编码
#以下方法可以将任意单一编码格式(仅支持utf8, gbk, unicode)的字符串转为目标编码格式(仅支持gbk、utf8)
#该方法的优点是:不用知道输入字符串的编码格式
#可以使用不同编码的‘你好’和‘你好中国’,测试以下方法,表现不同
import sys
def __code(s, src, target):
u = ''
while True:
try:
u = s.decode(src)#1可能抛异常,也可能不抛异常
except UnicodeDecodeError, e:#如果s是target编码,转成unicode失败,抛此异常
#print repr(e)
break
except UnicodeEncodeError, e:#如果s是unicode编码,转成unicode失败,抛此异常
#print repr(e)
u = s
try:
s = u.encode(target)
except Exception, e:
break
break
return s
def utf8(s):
return __code(s, 'gbk', 'utf8')
def gbk(s):
return __code(s, 'utf8', 'gbk')
######下面为该模块的测试代码##########
if __name__ == '__main__':
stdout_encode = sys.stdout.encoding #获取输出终端的编码方式
ss = ['', '', '', '']
ss[0] = '你好'#s0为utf8编码
ss[1] = '你好'.decode('utf8').encode('gbk')#s1为gbk编码
ss[2] = u'你好'#s2为unicode编码
ss[3] = 'hello, china'
print stdout_encode
for str in ss:
print str
count = 0
for str in ss:
print count
print utf8(str)
print gbk(str)
count += 1