如何解决Python“windows错误消息未正确编码”的问题?

2024-09-28 16:20:14 发布

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

当Python引发WindowsError时会有麻烦,异常消息的编码总是os native encoded。例如:

import os
os.remove('does_not_exist.file')

好吧,这里有个例外:

^{pr2}$

由于Windows7的语言是繁体中文,所以我得到的默认错误消息是big5编码(即CP950)。在

>>> try:
...     os.remove('abc.file')
... except WindowsError, value:
...     print value.args
...
(2, '\xa8t\xb2\xce\xa7\xe4\xa4\xa3\xa8\xec\xab\xfc\xa9w\xaa\xba\xc0\xc9\xae\xd7\xa1C')
>>>

正如您在这里看到的,错误消息不是Unicode,那么当我试图打印它时,会得到另一个编码异常。以下是问题,可以在python问题列表中找到: http://bugs.python.org/issue1754

问题是,如何解决这个问题?如何获取WindowsError的本机编码? 我使用的Python版本是2.6。在

谢谢。在


Tags: import消息编码valueos错误notremove
3条回答

这只是同一个错误消息的repr()字符串。由于您的主机已经支持cp950,所以只需打印所需的组件。在控制台中重新配置为使用cp950后,这在我的系统上有效。因为我的系统是英文而不是中文,所以我必须明确提出错误信息:

>>> try:
...     raise WindowsError(2,'系統找不到指定的檔案。')
... except WindowsError, value:
...     print value.args
...
(2, '\xa8t\xb2\xce\xa7\xe4\xa4\xa3\xa8\xec\xab\xfc\xa9w\xaa\xba\xc0\xc9\xae\xd7\xa1C')
>>> try:
...     raise WindowsError(2,'系統找不到指定的檔案。')
... except WindowsError, value:
...     print value.args[1]
...
系統找不到指定的檔案。

或者,使用python3.X。它使用控制台编码打印repr()。下面是一个例子:

^{pr2}$

在俄语版本的MS Windows中,我们也有同样的问题:默认语言环境的代码页是cp1251,但是Windows控制台的默认代码页是cp866

>>> import sys
>>> print sys.stdout.encoding
cp866
>>> import locale
>>> print locale.getdefaultlocale()
('ru_RU', 'cp1251')

解决方案应该是使用默认区域设置编码解码Windows消息:

^{pr2}$

坏消息是你仍然不能在logging.error()中使用exc_info=True。在

sys.getfilesystemencoding()应该有帮助。在

import os, sys
try:
    os.delete('nosuchfile.txt')
except WindowsError, ex:
    enc = sys.getfilesystemencoding()
    print (u"%s: %s" % (ex.strerror, ex.filename.decode(enc))).encode(enc)

除了打印到控制台之外,您可能需要将最终编码更改为“utf-8”

相关问题 更多 >