解决Python2.x的UnicodeEncodeError: ‘ascii’ codec can’t encode异常错误

转自:http://blog.csdn.net/kingviker/article/details/8950757程序员

刚遇到这个问题的时候,在网上找了 半天,发现都是说 添加以下三行代码便可解决问题,函数

1
2
3
import sys  
reload(sys)  
sys.setdefaultencoding( 'utf-8' )

我是在小小说下载器练手的时候遇到的问题,在将爬下来的小说内容写入都文件时报的错,因为其中一些内容,ascii编码不支持,因此报错。可是我加了以后还解决不了,通过一番思考和挖掘终于找到本质缘由,ui

     因此,更好的办法是,在输出的时候,对文件制定特定的UTF-8编码便可。而无需改动默认编码。编码

1
2
3
4
#不使用open打开文件,而使用codecs: 
fp = codecs.open(‘output.txt’, ‘a+’, ‘utf- 8 ′);; 
fp.write(row[ 1 ]); 
fp.close();

----------------------------------------------------------分割线-------------------------------------------------------------下面是我转载的一篇关于codecs的文章spa

字符的编码是按照某种规则在单字节字符和多字节字符之间进行转换的某种方法。从单字节到多字节叫作decoding,从多字节到单字节叫作encoding。在这些规则中常常用到的无非是UTF-8和GB2312两种。.net

 

在Python中,codecs模块提供了实现这些规则的方法,经过模块公开的方法咱们可以方便地获取某种编码方式的Encoder和 Decoder工厂函数(Factory function),以及StreamReader、StreamWriter和StreamReaderWriter类。 code

使用“import codecs”导入codecs模块。对象

codecs模块中重要的函数之一是lookup,它只有一个参数encoding,指的是编码方式的名称,即utf-8或者gb2312等等。以下示例:blog

>>> import codecsutf-8

>>> t = codecs.lookup("utf-8")

>>> print t

(<built-in function utf_8_encode>, <function decode at 0x00AA25B0>, <class encodings.utf_8.StreamReader at 0x00AA0720>, <class encodings.utf_8.StreamWriter at 0x00AA06F0>)

>>> encoder = t[0]

>>> decoder = t[1]

>>> StreamReader = t[2]

>>> StreamWriter = t[3]

lookup函数返回一个包含四个元素的TUPLE,其中t[0]是encoder的函数引用,t[1]是decoder的函数引用,t[2] 是UTF-8编码方式的StreamReader类对象引用,t[3]是UTF-8编码方式的StreamWriter类对象引用相信对Python熟悉的你确定知道接下来该怎么用它们了。

 

codecs模块还提供了方便程序员使用的单独函数,以简化对lookup的调用。它们是:

getencoder(encoding)

getdecoder(encoding)

getreader(encoding)

getwriter(encoding)

若是咱们只是想获取一种utf-8编码的encoder方法,那么只须要这样作:

>>> encoder = codecs.getencoder("utf-8")

 

另外,对于StreamReader和StreamWriter的简化, codecs模块提供一个open方法。相对于built-in对象File的open方法,前者多了三个参数encoding, errors, buffering。这三个参数都是可选参数,可是对于应用来讲,须要明确指定encoding的值,而errors和buffering使用默认值便可。使用方法以下:

>>> fin = codecs.open("e:\\mycomputer.txt", "r", "utf-8")

>>> print fin.readline()

这是个人电脑

>>> fin.close()

 

总结一下,codecs模块为咱们解决的字符编码的处理提供了lookup方法,它接受一个字符编码名称的参数,并返回指定字符编码对应的 encoder、decoder、StreamReader和StreamWriter的函数对象和类对象的引用。为了简化对lookup方法的调用, codecs还提供了getencoder(encoding)、getdecoder(encoding)、getreader(encoding)和 getwriter(encoding)方法;进一步,简化对特定字符编码的StreamReader、StreamWriter和 StreamReaderWriter的访问,codecs更直接地提供了open方法,经过encoding参数传递字符编码名称,便可得到对 encoder和decoder的双向服务。

相关文章
相关标签/搜索