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去解码。

     
  • 相关阅读:
    Linux-nmap
    MongoDb注意事项
    HTML如何转XTML
    Centos 64位 Install certificate on apache 即走https协议
    CentOS 下搭建部署独立SVN服务器全程详解(5.5)
    LNMP安装与配置
    64位CentOS 6.0下搭建LAMP环境
    Apache遇到的问题:APR not found
    超详细LAMP环境搭建
    偏方治百病
  • 原文地址:https://www.cnblogs.com/thouger/p/5070653.html
Copyright © 2011-2022 走看看