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

2024-10-01 22:32:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用我用Python编写的客户机从一个web服务中检索一个名称列表。检索列表后,我将每个名称编码为unicode,然后将每个名称打印到stdout。当我提到“Ólafur JóhannÓlafsson”这个名字时,我得到了以下错误:

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

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


Tags: in名称web编码列表客户机错误stdout
3条回答

来自^{}UnicodeDammit模块可以自动检测编码。在

from BeautifulSoup import UnicodeDammit

u = UnicodeDammit("Ólafur Jóhann Ólafsson")

print u.unicode
print u.originalEncoding

首先,当从文件、管道、套接字、终端等读取数据时,数据解码为Unicode(编码的缺失);在发送/持久化数据时,Unicode编码为适当的字节编码。我怀疑这是你问题的根源。在

web服务应该在接收到的头或数据中声明编码。print通常自动将Unicode编码为终端的编码(通过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。由于encode需要一个Unicode字符串,Python在编码到cp437之前,首先使用默认的ascii编码将字节字符串解码为Unicode。在

通过解码而不是编码数据来解决这个问题,print将自动编码到stdout。只要您的终端支持数据中的字符,它就会正确显示:

^{pr2}$

此页可以帮助您http://wiki.python.org/moin/PrintFails

问题是,我想,你需要把这些名字打印到控制台。你真的需要它吗?或者只是一个测试环境?如果您只使用控制台进行测试,您可以切换到其他工具,如单元测试来检查您到底得到了什么值。在

相关问题 更多 >

    热门问题