I can believe fly.

Thursday, March 5, 2009

python编码知识

事件
file1[utf-8]->file2[gbk],从file1读取的数据类型type(数据)是str类型
这时候,如果要将该数据以gbk编码写入file2,则需要作转换:
        var = unicode(var, 'uft-8').encode('gbk')
相反的需求:
        var = unicode(var, 'gbk').encode('uft-8') 
你也可以写个unicode检测信息
        # 检测,如果var不是unicode,则相应转换
        if not isinstance( var, unicode): 
            try:
                var = var. decode ("utf-8", 'ignore')
            except:
                var = var. decode ("gbk", 'ignore')
问题现象
(编码转换过程中经常会有以下的错误提示)
Errors: 'ascii' codec can't encode characters in position 26-27: ordinal not in range(128)
Errors: 'gbk' codec can't encode character u'\u036c' in position 26: illegal multibyte sequence
知识点
decode 解码,将指定的编码转换为unicode
格式:decode([encoding], [errors='strict']),可以用第二个参数控制错误处理的策略,默认的参数就是strict,代表遇到非法字符时抛出异常;
如果设置为ignore,则会忽略非法字符;
如果设置为replace,则会用?取代非法字符;
如果设置为xmlcharrefreplace,则使用XML的字符引用。
例子:
var. decode ("gbk") var为gbk编码,转为unicode. (同等式=unicode(var,"gbk"))
var. decode ("gbk", 'ignore') var为gbk编码,转为unicode. 忽略非法字符
encode 编码,将unicode解为指定的编码
var.encode('gbk')
如果两个编码需要转换,则:unicode(a, 'gbk').encode('utf-8')
先将gbk编码转为unicode,然后在转为utf-8
关键
你要清楚接收的数据原编码是啥,最终又是以什么目标编码存储。]
实例
命令行:cmd = E:\WorkDir\yusulian\2009\ver_manage\dirrepo\Case2\DubaRelease\2009\copysharedata.bat \\192.168.11.22 ysl ysl 版本\公测 20081104.13586 standard\beta
执行: os.system(cmd)
出错:
   File "getdata.py", line 61, in getdata
    os.system(cmd)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 114-117:
解决:
先把cmd转为unicode
if not isinstance( cmd, unicode): 
    try:
        cmd = cmd. decode ("utf-8")
    except:
        cmd = cmd. decode ("gbk")

执行的时候, 把cmd转为gbk/utf-8编码
os.system ( cmd. encode("gbk") )
或者
os.system ( cmd. encode("utf-8") )
相关资讯


No comments: