4

Python が WindowsError を発生させたときの問題です。例外のメッセージのエンコーディングは常に os-native-encoded です。例えば:

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 です。

ありがとう。

4

3 に答える 3

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悪いニュースは、まだin を使用できないことですlogging.error()

于 2010-04-20T21:28:56.487 に答える
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.
>>> '系統找不到指定的檔案。'
'系統找不到指定的檔案。'
于 2010-04-20T05:49:30.860 に答える
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」に変更したい場合があります

于 2010-04-19T15:20:20.943 に答える