7

ロギングシステムによってメッセージを印刷したり、コマンドを印刷したりするスクリプトがあります。Windowsコンソールでは、次のようなエラーメッセージが表示されます。

Traceback (most recent call last):
  File "C:\Python32\lib\logging\__init__.py", line 939, in emit
    stream.write(msg)
  File "C:\Python32\lib\encodings\cp850.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_map)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\u2019' in position 4537:character maps to <undefined>

ロギングシステム、印刷コマンドなどのすべてのエンコーディングをフェイルセーフにする(エラーを無視する)一般的な方法はありますか?

4

1 に答える 1

9

問題は、ターミナル/シェル(Windowsの場合はcmd)がすべてのUnicode文字を印刷できないことです。

errorsメソッドの引数を使用して、文字列をフェイルセーフでエンコードできますstr.encode。たとえば、を設定することで、サポートされていない文字をに置き換えることができ?ますerrors='replace'

>>> s = u'\u2019'
>>> print s
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\encodings\cp850.py", line 12, in encode
    return codecs.charmap_encode(input,errors,encoding_map)
UnicodeEncodeError: 'charmap' codec can\'t encode character u'\u2019' in position
 0: character maps to <undefined>
>>> print s.encode('cp850', errors='replace')
?

他のオプションについては、ドキュメントを参照してください。

編集ロギングの一般的なソリューションが必要な場合は、サブクラス化できますStreamHandler

class CustomStreamHandler(logging.StreamHandler):

    def emit(self, record):
        record = record.encode('cp850', errors='replace')
        logging.StreamHandler.emit(self, record)
于 2012-06-15T12:22:00.563 に答える