2012-06-15 6 views
6

私は、ロギングシステムによってメッセージを出力するスクリプトや、時にはprintコマンドを使用します。 Windowsコンソールに私はPythonのエンコーディングエラーを防止する

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> 

のようなエラーメッセージを取得ロギングシステム内のすべてのエンコーディングを作るための一般的な方法は、フェイルセーフ(エラーを無視)など、印刷コマンドはありますか?

答えて

9

問題は、あなたのターミナル/シェル(Windows上のcmd)がすべてのUnicode文字を出力できないことです。

str.encodeメソッドのerrors引数を使用して文字列をフェールセーフでエンコードできます。たとえば、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') 
? 

その他のオプションについては、documentationを参照してください。

class CustomStreamHandler(logging.StreamHandler): 

    def emit(self, record): 
     record = record.encode('cp850', errors='replace') 
     logging.StreamHandler.emit(self, record) 
+0

をしかし、私はエンコードを事前場合、すべての文字列は、彼らがで彼らの行動を変えるかもしれない(バイト)の種類を変更:

編集ロギングのための一般的な解決策が必要な場合は、StreamHandlerサブクラス化することができますインテリア?また、内蔵のコーデックライブラリにもあります。私はそれを変えることはできません。コーデックでオプションを設定できますか? – Gerenuk

+0

もちろん、印刷/ロギングの前にそれらをエンコードするだけです。 – schlamar

+0

一般的なロギングソリューションで自分の答えを編集しました。 – schlamar