【发布时间】:2016-03-13 11:28:35
【问题描述】:
我正在管理一些 Python 代码,现在我在日志中看到一个错误:
Traceback (most recent call last):
File "./app/core.py", line 772, in scrapeEmail
l.info('EMAIL SUBJECT: ', header['value'])
File "./app/__init__.py", line 44, in info
logging.info(str(datetime.utcnow()) + ' INFO ' + caller.filename + ':' + str(caller.lineno) + ' - ' + ' '.join([str(x) for x in args]))
UnicodeEncodeError: 'ascii' codec can't encode character u'\xea' in position 25: ordinal not in range(128)
我猜这意味着header['value'] 包含不同编码的字符。
我四处搜索,this SO answer 建议“将.encode('utf-8') 放在对象末尾以获取最新版本的 Python”。
这给我提出了两个问题:
- 我需要在什么对象上使用
.encode('utf-8')。在x或str(x)上。那么应该是str(x.encode('utf-8'))还是str(x).encode('utf-8')? - 作者所说的“Python 的最新版本”是什么意思?我还能在 Python
2.7中使用.encode('utf-8')吗?
通常我会简单地尝试一下,但要找到发生错误的字符串并不容易(实际上是不可能的)。所以我无法真正测试它。
在这里,我们将不胜感激。
【问题讨论】:
-
对于 1) 除非你的对象 x 实现了方法
encode,否则你在字符串上使用它(它有一个方法.encode) -
那个答案与你无关;随机将编码放在字符串调用的末尾不太可能有帮助。问题更有可能是您用自己的实现覆盖了
info方法,这没有做正确的事情。关于在日志消息中放入什么内容的决定属于formatter,而不是记录器子类。 -
你试过用 unicode('something') 代替 str('something') 吗?
标签: python string encoding utf-8 character-encoding