代码之家  ›  专栏  ›  技术社区  ›  kobrien

当我不能预先知道字符编码时,如何打印字符串列表?

  •  1
  • kobrien  · 技术社区  · 14 年前

    UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: 
                        ordinal not in range(128)
    

    因为我不知道编码是什么,我如何将所有这些字符串转换成unicode?或者你能提出一个更好的方法来处理这个问题吗?

    3 回复  |  直到 14 年前
        1
  •  1
  •   Mark Tolonen    14 年前

    首先,你 解码 缺席 (指编码)读取文件、管道、插座、终端等时;以及 编码

    print sys.stdout.encoding )或者在没有这些的情况下 ascii . 如果目标编码不支持数据中的字符,则会得到 UnicodeEncodeError

    因为这不是你收到的错误,你应该张贴一些代码,这样我们就可以看到你正在做什么。很可能,你是 编码 解码 . 下面是一个例子:

    >>> data = '\xc2\xbd' # UTF-8 encoded 1/2 symbol.
    >>> data.encode('cp437')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "C:\dev\python\lib\encodings\cp437.py", line 12, in encode
        return codecs.charmap_encode(input,errors,encoding_map)
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 0: ordinal not in range(128)
    

    我在这里做的是打电话 encode 在字节字符串上。自 需要Unicode字符串,Python使用默认值 ascii码 先将字节字符串解码为Unicode,然后再将其编码为Unicode cp437

    通过解码而不是编码数据来解决这个问题,然后 打印

    >>> import sys
    >>> sys.stdout.encoding
    'cp437'
    >>> print data.decode('utf8') # implicit encode to sys.stdout.encoding
    ½
    >>> print data.decode('utf8').encode('cp437') # explicit encode.
    ½
    
        2
  •  1
  •   leoluk    14 年前

    这个 UnicodeDammit 模块来自 BeautifulSoup 可以自动检测编码。

    from BeautifulSoup import UnicodeDammit
    
    u = UnicodeDammit("Ólafur Jóhann Ólafsson")
    
    print u.unicode
    print u.originalEncoding
    
        3
  •  1
  •   dmitko    14 年前