我正在尝试打印以下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)
非常感谢你!
答案 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)
free_form_request
为encode
- d为字节字符串,使用utf-8
作为编码。这有效,因为utf-8
可以代表[EXID(이엑스아이디)] 위아래 (UP&DOWN) MV
。'{ts}: free form request {free_form_request} requested from {nick}'
)是 unicode字符串(因为导入的from __future__ import unicode_literals
)。decode
创建1中创建的字节字符串来创建 unicode string (作为格式参数有效)。decode
尝试ascii
- 并且失败,因为字节字符串是utf-8
字节字符串,其中包含不包含的字节值在ascii
中有意义。 UnicodeDecodeError
。请注意,虽然代码显然在这里做了一些事情,但这实际上不会在Python 3上抛出异常,而是替换字节字符串的repr
(repr
是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在评论中的答案。