exceptions.UnicodeDecodeError - 'ascii'编解码器无法解码字节

时间:2014-12-11 03:57:07

标签: python unicode utf-8 ascii

我一直收到这个错误:

<type 'exceptions.UnicodeDecodeError'>: 'ascii' codec can't decode byte 0xe2 in position 0: ordinal not in range(128)
      args = ('ascii', '\xe2\x9d\xb6 Senn =)', 0, 1, 'ordinal not in range(128)')
      encoding = 'ascii'
      end = 1
      message = ''
      object = '\xe2\x9d\xb6 Senn =)'
      reason = 'ordinal not in range(128)'
      start = 0

使用此代码:

    steamFriend = data['response']['players'][i]
    n = steamUser(steamFriend['personaname'].encode("utf-8"), steamFriend['steamid'], steamFriend['avatarfull'], steamFriend['profileurl'], steamFriend['personastate'], False)

有些事情需要注意:

  • steamFriend是一个JSON对象
  • 我有时只会收到此错误,因为steamFriend['personaname']包含一些奇怪的符号(例如❶),而且我不知道如何正确解析这个错误,所以我不会收到错误。

非常感谢任何帮助。 此外,\xe2\x9d\xb6 Senn =)应该代表❶ Senn =),如果有帮助的话。

2 个答案:

答案 0 :(得分:1)

没有看到完整的代码,很难说,但似乎steamUser期望ascii输入。如果这是问题所在,您可以通过以下方式解决:

streamFriend['personaname'].encode("ascii", errors="ignore")

streamFriend['personaname'].encode("ascii", errors="replace")

显然你会在这个过程中丢失unicode字符。

答案 1 :(得分:1)

如果在n=...行上发生引用错误,则意味着steamFriend['personaname']是字节字符串,而不是Unicode字符串。

因此当你问.encode时,Python必须 de 将字符串编码为Unicode才能 en 将其编码回字节。使用默认编码(即ASCII)进行隐式解码,因为字节字符串不仅包含ASCII,否则会出现故障。

你确定你没有意思这样做:

steamFriend['personaname'].decode("utf-8")

de 使用UTF-8对字节串'\xe2\x9d\xb6 Senn =)'进行编码会得到Unicode字符串u'\u2776 Senn =)',其中U + 2776 =❶所以看起来更像是你正在追求。

(但是,正常情况下,JSON字符串显式是Unicode,因此不清楚从哪里获取字节字符串。如何加载JSON内容?)