我正在尝试记录文件的内容,但是我从日志记录模块(而不仅仅是那个)获得了一些有趣的行为。
这是文件内容:
"Testing …"
Testing å¨'æøöä
"Testing å¨'æøöä"
以下是我打开并记录它的方式:
with codecs.open(f, "r", encoding="utf-8") as myfile:
script = myfile.read()
log.debug("Script type: {}".format(type(script)))
print(script)
log.debug("{}".format(script.encode("utf8")))
我记录对象类型的行在我的日志中显示如下:
Script type: <type 'unicode'>
然后print ...
行将内容正确打印到控制台,但是,日志记录模块会抛出异常:
Traceback (most recent call last):
File "/usr/lib/python2.7/logging/__init__.py", line 882, in emit
stream.write(fs % msg.encode("UTF-8"))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 63: ordinal not in range(128)
当我从最后一行删除.encode("utf8")
位时,我得到了预期的异常:
'ascii' codec can't encode character u'\u2026' in position 9: ordinal not in range(128)
这只是为了证明这个问题。它不仅仅是记录模块。在处理这个“unicode”字符串时,我的其余代码也会抛出类似的异常。
我做错了什么?
答案 0 :(得分:1)
记录处理Unicode值就好了:
>>> import logging
>>> logging.basicConfig(level=logging.DEBUG)
>>> script = u'"Testing …"'
>>> logging.debug(script)
DEBUG:root:"Testing …"
(写入日志文件将导致UTF-8编码的消息)。
出错的地方是使用str.format()
混合字节字符串和Unicode值:
>>> "{}".format(script)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2026' in position 9: ordinal not in range(128)
如果您使用 unicode
格式字符串,则可以避免使用强制隐式编码:
>>> u"{}".format(script)
u'"Testing \u2026"'