防止Python中的编码错误

Ger*_*nuk 7 python windows console encoding

我有脚本通过日志记录系统打印消息或有时打印命令.在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>
Run Code Online (Sandbox Code Playgroud)

是否有一般方法在记录系统,打印命令等中进行所有编码的故障安全(忽略错误)?

sch*_*mar 9

问题是您的终端/ shell(cmd就像在Windows上一样)无法打印每个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')
?
Run Code Online (Sandbox Code Playgroud)

有关其他选项,请参阅文档.

编辑如果需要日志记录的常规解决方案,可以进行子类化StreamHandler:

class CustomStreamHandler(logging.StreamHandler):

    def emit(self, record):
        record = record.encode('cp850', errors='replace')
        logging.StreamHandler.emit(self, record)
Run Code Online (Sandbox Code Playgroud)