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

本文纯属个人见解,是对前面学习的总结,如有描述不正确的地方还请高手指正~

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

import sys 
reload(sys) 
sys.setdefaultencoding('utf-8')

        但是我加了之后还解决不了,经过一番思考和发掘终于找到本质原因,

        我是在小小说下载器练手的时候碰到的问题,在将爬下来的小说内容写入都文件时报的错,由于其中一些内容,ascii编码不支持,所以报错。

     所以,更好的方法是,在输出的时候,对文件制定特定的UTF-8编码便可。而无需修改默认编码。

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

     

    下面是我转载的一篇关于codecs的文章

    ----------------------------------------------------------分割线-------------------------------------------------------------

    

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

    

 

    

在Python中,codecs模块供给了实现这些规矩的方法,通过模块公开的方法我们能够便利地获取某种编码方式的Encoder和 Decoder工厂函数(Factory function),以及StreamReader、StreamWriter和StreamReaderWriter类。

    

 

    

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

    

 

    

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

    

    >>> import codecs
>>> 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的双向服务。

    

文章结束给大家分享下程序员的一些笑话语录: 程序员的愿望
  有一天一个程序员见到了上帝.上帝: 小伙子,我可以满足你一个愿望.程序员: 我希望中国国家队能再次打进世界杯.
  上帝: 这个啊!这个不好办啊,你还说下一个吧!
  程序员: 那好!我的下一个愿望是每天都能休息6个小时以上.
  上帝: 还是让中国国家打进世界杯.

posted @ 2013-05-20 21:08  xinyuyuanm  阅读(217)  评论(0编辑  收藏  举报