python编码问题分析

来源:互联网 发布:unity 删除数组 编辑:程序博客网 时间:2024/06/05 17:53

本文首先简要介绍编码转换的基本原理,然后针对字符串处理、文件读写的两个实例,具体分析编码问题的处理方式。

 

1、编码转换的基本原理

我们知道,只有在面对中文、日文等编码字符(以下均以中文字符为例)时,才会有编码转换问题;而英文字符串是不存在编码转换问题的,因为转来转去都不会变化。

那么分别在什么情况下编码和解码?看下面两个例子就清楚了: 

1)编码:Unicode(中文字符)-->String(字符串),当需要把中文字转换为字符串时,用编码encode。

u'中国'  #UnicodeOut[1]: u'\u4e2d\u56fd' type(u'中国')<type 'unicode'> u'中国'.encode('utf-8') #编码Out[2]: '\xe4\xb8\xad\xe5\x9b\xbd' # String type('\xe4\xb8\xad\xe5\x9b\xbd')<type 'str'>

 2)解码:String(字符串) --> Unicode(中文字符),当需要把字符串转换回中文字时,用解码decode。

'\xe4\xb8\xad\xe5\x9b\xbd'.decode('utf-8') #解码Out[5]: u'\u4e2d\u56fd' print u'\u4e2d\u56fd' # Unicode中国
 


2、将列表中的数字、字符串、Unicode都转换为string,如何处理?

假设待处理列表为:lst = [1, 'abc', u'中国'],如果使用for循环和str()函数,会导致报错,从以下报错信息中可以发现:其实str()函数在尝试对u'中国'进行ascii编码,这当然行不通;正确的方法是单独用encode()处理Unicode字符。举例如下

 错误的处理方法:

for i in lst:   print str(i) #错误的处理方法#报错:UnicodeEncodeError:'ascii' codec can't encode characters in position 0-1: ordinal not inrange(128)

 正确的处理方法:

for i in lst:   if isinstance(i, unicode): #单独处理unicode字符       print i.encode('utf-8')   else: #其余的情况用str()函数处理        print str(i)       #1#abc#中国


3、将编码为A的数据,输出到编码为B的文件,如何处理? 

举例说明:假设源数据所采用编码为utf-8,希望将源数据保存到编码为gbk的文件。 

基本思路:先将utf-8格式源数据decode()回unicode字符(python底层默认编码),注意源文件编码为utf-8,所以decode()中的参数应为utf-8;然后将源文件输出到编码为gbk的文件,注意输出到文件的过程是:将文件内容encode成为我们需要的gbk字符串。 

代码如下:

content = u'中国'.encode('utf-8') #演示用:生成utf-8偏码的源数据 content = content.decode('utf-8') #使用utf-8格式解码,得到unicode字符 #源数据保存到编码为gbk的文件,相当于content.encode('gbk')后保存到文件。path = './'with codecs.open(path, 'wb', encoding ='gbk', errors='ignore') as f:       f.write(content) 


0 0
原创粉丝点击