防止Python中的编码错误

2024-09-28 21:37:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我有脚本,可以通过日志系统打印消息,有时还可以打印命令。在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>

有没有一种通用的方法可以使日志系统中的所有编码、打印命令等都失效保护(忽略错误)?


Tags: inpy命令脚本windowslib系统错误
1条回答
网友
1楼 · 发布于 2024-09-28 21:37:23

问题是,您的终端/shell(在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

编辑如果您想要日志记录的一般解决方案,您可以子类StreamHandler

class CustomStreamHandler(logging.StreamHandler):

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

相关问题 更多 >