【问题标题】:How to use .encode('utf-8') in Python?如何在 Python 中使用 .encode('utf-8')?
【发布时间】: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”。

这给我提出了两个问题:

  1. 我需要在什么对象上使用.encode('utf-8')。在xstr(x) 上。那么应该是str(x.encode('utf-8')) 还是str(x).encode('utf-8')
  2. 作者所说的“Python 的最新版本”是什么意思?我还能在 Python 2.7 中使用 .encode('utf-8') 吗?

通常我会简单地尝试一下,但要找到发生错误的字符串并不容易(实际上是不可能的)。所以我无法真正测试它。

在这里,我们将不胜感激。

【问题讨论】:

  • 对于 1) 除非你的对象 x 实现了方法 encode,否则你在字符串上使用它(它有一个方法 .encode
  • 那个答案与你无关;随机将编码放在字符串调用的末尾不太可能有帮助。问题更有可能是您用自己的实现覆盖了info 方法,这没有做正确的事情。关于在日志消息中放入什么内容的决定属于formatter,而不是记录器子类。
  • 你试过用 unicode('something') 代替 str('something') 吗?

标签: python string encoding utf-8 character-encoding


【解决方案1】:

我建议你先搞清楚unicode与其他编码格式(如GB2312、GBK)的关系。很快编码和解码就没有大问题了:)

下图将向您展示关系,一旦您掌握了要点,您就会知道何时以及如何在代码中进行编码和解码。 :)

---------              -----------             ----------
|       |  1.decode(A) |         | 2.encode(B) |        |
|   A   | -----------> | unicode | ----------->|   B    |
|       | <----------- |         | <---------- |        |
|       |  4.encode(A) |         | 3.decode(B) |        |
---------              -----------             ----------

所以,根据图,你应该知道现在是什么编码,要转换什么编码,然后按照图中的关系。

【讨论】:

    猜你喜欢
    • 2015-08-02
    • 2020-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-31
    • 1970-01-01
    • 2020-07-15
    • 1970-01-01
    相关资源
    最近更新 更多