zoukankan      html  css  js  c++  java
  • python编码遇过的问题

    参照:http://wklken.me/posts/2013/08/31/python-extra-coding-intro.html

    曾经出现过这样的问题

    UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)是因为对str进行编码
    UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)是因为对Unicode进行解码
    上面两个都会出错
    来看看判断是否为unicode/str的方法
    >>> isinstance(u'中文', unicode)
    True
    >>> isinstance('中文', unicode)
    False
    
    >>> isinstance('中文', str)
    True
    >>> isinstance(u'中文', str)
    False
    总之不要对str使用encode,不要对unicode使用decode

    一般在开头写上# -*- coding: utf-8 -*-之类的,都会统一源文件要保存的编码,然后在代码里,其他在源代码用作处理的硬编码字符串,统一用unicode,即用u'中文',而不是'中文',这样在代码里面除了外部来的东西里面的就都是Unicode和utf-8了,先获得系统的默认编码,然后再编码,这样就不会乱码了

    chardef包可以检测一个文件是用什么编码的
    >>> import chardet
    >>> f = open('test.txt','r')
    >>> result = chardet.detect(f.read())
    >>> result
    {'confidence': 0.99, 'encoding': 'utf-8'}


    UnicodeDecodeError: 'gbk' codec can't decode bytes in position 32-33: illegal multibyte sequence错误
    Unicode的解码(Decode)出现错误(Error)
    接着看
    'gbk' codec can't decode bytes in position 32-33,在23至33行出现了错误,原因是gbk不能被解码
    因此猜测,是打算以gbk编码方式去解码让字符串变成Unicode,但是这里不能解码,illegal multibyte sequence就是无法解码,
    总结:将一个字符串,通过gbk的方式,去解码,想要获得Unicode字符串,结果出错了
    此种错误,原因是: 
    要处理的字符串本身不是gbk编码,但是你却以gbk编码去解码 
    比如,字符串本身是utf-8的,但是你却用gbk去解码utf-8的字符串,所以结果不用说,则必然出

    解决办法:

    如果你确定当前字符串,比如抓取网页通过charset=utf-8,已经确定html的字符串是utf-8的,

    则可以直接去通过utf-8去解码。

     
  • 相关阅读:
    上周热点回顾(12.2112.27)
    评论表聚集索引引起的评论超时问题
    上周热点回顾(11.3012.6)
    jQuery 专题上线了
    博客园电子期刊2009年11月刊发布啦
    memcached罢工引发的血案博客园评论超时问题处理过程
    机房线路割接通知
    上周热点回顾(12.712.13)
    博客园首页优化心得
    上周热点回顾(12.1412.20)
  • 原文地址:https://www.cnblogs.com/thouger/p/5070653.html
Copyright © 2011-2022 走看看