当引发包含Unicode文字(u"\u0410")的异常时,无法在Windows控制台中获得输出。

4

当Python异常信息中包含任何Unicode文字时,会遇到在win控制台打印的问题。有时候,这些Unicode文字根本不会被打印出来,有时候则会被错误地打印出来。而控制台的编码方式是cp866。

当Python默认编码为ascii时也会出现这种情况。

raise LookupError(u"symbol: \u0411")

打印结果为:

LookupError


当我将默认编码设置为utf-8时,我会得到:

LookupError:symbol: ╨С


当我执行以下操作时:

print u"symbol: \u0411"

在这两种情况下,我得到的结果是:

符号: Б

为什么会有这种行为的差异? 该怎么做才能做到正确呢?


1
显然,Python 3 对这种东西有更好的支持... 我做本地化工作,经常遇到这种问题... - Joran Beasley
当我将默认编码设置为utf-8时,您是指PYHTONIOENCODING环境变量还是在模块头中设置编码? - Boris Burkov
Bob,我使用的是import sys,reload(sys),sys.setdefaultencoding("utf-8")。 - Unicorn
1个回答

1
当 Python 尝试使用由 sys.getdefaultencoding() 返回的编码对 Unicode 消息进行编码时,异常将被打印并输出。如果失败,则会抑制编码错误并得到奇怪的输出。
在打印情况下,Unicode 字符串使用 sys.stdout.encoding 进行编码。是的,如果 excepthook 使用 sys.stderr.encoding 而不是 sys.getdefaultencoding(),那么可能会更好。
请注意,以下内容有效。
raise LookupError(u"symbol: \u0411".encode(your_encoding))

你可以通过调用sys.setdefaultencoding(your_encoding)sitecustomizeusercustomize中更改默认编码。你的系统应该配置为默认编码等于sys.stderr.encoding(以及其他标准流的编码)。此外,在Python 3中,这个问题已经不存在了。

关键在于 sys.getdefaultencoding()sys.stderr.encoding 之间的区别。 - Mark Ransom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接