2012-06-15 69 views
6

我有一些腳本可以通過日誌記錄系統打印出消息,或者有時會打印命令。在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

問題是,您的終端/ shell(cmd與您在Windows上一樣)無法打印每個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的其他選項。

編輯如果你想要記錄的通用解決方案,你也可以繼承StreamHandler

class CustomStreamHandler(logging.StreamHandler): 

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

但如果我預編碼的所有字符串他們改變類型(以字節爲單位),這可能會更改他們的行爲室內?它也在內置的編解碼器庫中。我無法改變這一點。我可以在編解碼器中設置選項嗎? – Gerenuk

+0

您只需在打印/記錄日期前編碼它們。 – schlamar

+0

用一般的日誌記錄解決方案編輯我的答案。 – schlamar