Python 2.7.6 + unicode_literals - UnicodeDecodeError:'ascii'编解码器无法解码字节

时间:2015-05-15 13:17:47

标签: python python-2.7 unicode

我正在尝试打印以下unicode字符串,但我收到UnicodeDecodeError: 'ascii' codec can't decode byte错误。你能帮忙形成这个查询,以便它可以正确打印unicode字符串吗?

>>> from __future__ import unicode_literals
>>> ts='now'
>>> free_form_request='[EXID(이엑스아이디)] 위아래 (UP&DOWN) MV'
>>> nick='me'

>>> print('{ts}: free form request {free_form_request} requested from {nick}'.format(ts=ts,free_form_request=free_form_request.encode('utf-8'),nick=nick))

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xec in position 6: ordinal not in range(128)

非常感谢你!

1 个答案:

答案 0 :(得分:4)

以下是构造此字符串时发生的情况:

'{ts}: free form request {free_form_request} requested from {nick}'.format(ts=ts,free_form_request=free_form_request.encode('utf-8'),nick=nick)
  1. free_form_requestencode - d为字节字符串,使用utf-8作为编码。这有效,因为utf-8可以代表[EXID(이엑스아이디)] 위아래 (UP&DOWN) MV
  2. 但是,格式字符串('{ts}: free form request {free_form_request} requested from {nick}')是 unicode字符串(因为导入的from __future__ import unicode_literals)。
  3. 您不能将字节字符串用作 unicode字符串的格式参数,因此Python会尝试decode创建1中创建的字节字符串来创建 unicode string (作为格式参数有效)。
  4. Python使用默认编码decode尝试ascii - 并且失败,因为字节字符串是utf-8字节字符串,其中包含不包含的字节值在ascii中有意义。
  5. Python抛出UnicodeDecodeError
  6. 请注意,虽然代码显然在这里做了一些事情,但这实际上不会在Python 3上抛出异常,而是替换字节字符串的reprrepr是unicode字符串)。

    要解决您的问题,只需将unicode字符串传递给format即可。

    也就是说,不要执行步骤1.将free_form_request编码为字节字符串:通过删除.encode(...)将其保留为unicode字符串:

    '{ts}: free form request {free_form_request} requested from {nick}'.format(
        ts=ts, 
        free_form_request=free_form_request, 
        nick=nick)
    

    请注意Padraic Cunningham在评论中的答案。