当Python引发WindowsError时,这是一个麻烦,异常消息的编码总是以os-native编码。例如:
import os
os.remove('does_not_exist.file')
好吧,我们得到一个例外:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
WindowsError: [Error 2] 系統找不到指定的檔案。: 'does_not_exist.file'
由于我的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。
感谢。
答案 0 :(得分:4)
我们在俄语版的MS Windows中遇到同样的问题:默认语言环境的代码页是cp1251
,但Windows控制台的默认代码页是cp866
:
>>> import sys
>>> print sys.stdout.encoding
cp866
>>> import locale
>>> print locale.getdefaultlocale()
('ru_RU', 'cp1251')
解决方案应该是使用默认语言环境编码解码Windows消息:
>>> try:
... os.remove('abc.file')
... except WindowsError, err:
... print err.args[1].decode(locale.getdefaultlocale()[1])
...
坏消息是你仍然无法在exc_info=True
中使用logging.error()
。
答案 1 :(得分:0)
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”
答案 2 :(得分:0)
这只是同一错误消息的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]
...
系統找不到指定的檔案。
或者,使用Python 3.X.它使用控制台编码打印repr()。这是一个例子:
Python 2.6.5 (r265:79096, Mar 19 2010, 21:48:26) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> '系統找不到指定的檔案。'
'\xa8t\xb2\xce\xa7\xe4\xa4\xa3\xa8\xec\xab\xfc\xa9w\xaa\xba\xc0\xc9\xae\xd7\xa1C'
Python 3.1.2 (r312:79149, Mar 21 2010, 00:41:52) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> '系統找不到指定的檔案。'
'系統找不到指定的檔案。'