python之中文编码转换

   常用的中文编码主要有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)的字符串转为目标编码格式(仅支持gbkutf8)

#该方法的优点是:不用知道输入字符串的编码格式

#可以使用不同编码的你好你好中国,测试以下方法,表现不同

import sys

def __code(ssrctarget):

    u = ''

    while True:

        try:

            u = s.decode(src)#1可能抛异常,也可能不抛异常

        except UnicodeDecodeError, e:#如果starget编码,转成unicode失败,抛此异常

            #print repr(e)

            break

        except UnicodeEncodeError, e:#如果sunicode编码,转成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] = '你好'#s0utf8编码

    ss[1] = '你好'.decode('utf8').encode('gbk')#s1gbk编码

    ss[2] = u'你好'#s2unicode编码

    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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值