好好学习,天天向上

UnicodeDecodeError实录

UnicodeDecodeError错误是在使用Python的时候最常碰到的问题。谁让我们博大精深的中文不能用简简单单256个字符表示呢。 加之有很多错误犯了又犯。因此,整理此UnicodeDecodeError菜谱。(此文会不定时更新╮(╯▽╰)╭)

  • 解析网页返回值时使用例如resp.decode("utf-8")出现'utf8' codec can't decode byte 0x8b in position 1: 查看response header有Content-Type:application/x-javascript; charset=UTF-8。因此使用utf-8解码是没有问题的。去掉decode直接print到控制台却发现resp为一堆乱码。 此时,查看response header发现Content-Encoding:gzip。(关于gzip,可以参考HTTP协议 (三) 压缩)因此,可以选择手动解压,或者去掉Content-Encoding:gzip 参考: urllib2 乱码问题

  • json.dump生成的文件中中文被保存成\uXXXX\uXXXX的形式。 因为json.dumps 序列化时对中文默认使用的ascii编码.想输出真正的中文需要指定ensure_ascii=False。 参考:python json.dumps 中的ensure_ascii 参数引起的中文编码问题

  • 使用scrapy时,用export feed导出的json文件中若出现中文,中文会被保存成\uXXXX\uXXXX的形式。 原因同上.修改方式是: 找到scrapy/extensions/feedexport.py文件,将FeedExporter类中的open_spider方法修改为如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    def open_spider(self, spider):
    uri = self.urifmt % self._get_uri_params(spider)
    storage = self._get_storage(uri)
    file = storage.open(spider)
    # enable user defined feed parameters
    kw = self.settings.get('FEED_PARAMS',{})
    exporter = self._get_exporter(file, fields_to_export=self.export_fields,**kw)
    exporter.start_exporting()
    self.slot = SpiderSlot(file, exporter, storage, uri)
    然后在project的settings.py文件中增加一行配置项:FEED_PARAMS = {'ensure_ascii': False, 'indent': 4}

  • 解析html,根据charset得知编码方式为gb2312,因此解码使用html.decode("gb2312"),结果报错:UnicodeDecodeError: 'gb2312' codec can't decode bytes in position 218066-218067 有些网站虽然声明了编码方式为gb2312,但实际上应该使用这个字符集的超集GBK来解码。修改成html.decode("gbk")即可。

请言小午吃个甜筒~~