UnicodeDecodeError:\'utf8\'编解码器无法解码位置3-6中的字节:无效数据

| unicode是如何在python2上工作的?我就是不明白。 在这里,我从服务器下载数据并解析为JSON。
Traceback (most recent call last):
  File \"/usr/local/lib/python2.6/dist-packages/eventlet-0.9.12-py2.6.egg/eventlet/hubs/poll.py\", line 92, in wait
    readers.get(fileno, noop).cb(fileno)
  File \"/usr/local/lib/python2.6/dist-packages/eventlet-0.9.12-py2.6.egg/eventlet/greenthread.py\", line 202, in main
    result = function(*args, **kwargs)
  File \"android_suggest.py\", line 60, in fetch
    suggestions = suggest(chars)
  File \"android_suggest.py\", line 28, in suggest
    return [i[\'s\'] for i in json.loads(opener.open(\'https://market.android.com/suggest/SuggRequest?json=1&query=\'+s+\'&hl=de&gl=DE\').read())]
  File \"/usr/lib/python2.6/json/__init__.py\", line 307, in loads
    return _default_decoder.decode(s)
  File \"/usr/lib/python2.6/json/decoder.py\", line 319, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File \"/usr/lib/python2.6/json/decoder.py\", line 336, in raw_decode
    obj, end = self._scanner.iterscan(s, **kw).next()
  File \"/usr/lib/python2.6/json/scanner.py\", line 55, in iterscan
    rval, next_pos = action(m, context)
  File \"/usr/lib/python2.6/json/decoder.py\", line 217, in JSONArray
    value, end = iterscan(s, idx=end, context=context).next()
  File \"/usr/lib/python2.6/json/scanner.py\", line 55, in iterscan
    rval, next_pos = action(m, context)
  File \"/usr/lib/python2.6/json/decoder.py\", line 183, in JSONObject
    value, end = iterscan(s, idx=end, context=context).next()
  File \"/usr/lib/python2.6/json/scanner.py\", line 55, in iterscan
    rval, next_pos = action(m, context)
  File \"/usr/lib/python2.6/json/decoder.py\", line 155, in JSONString
    return scanstring(match.string, match.end(), encoding, strict)
UnicodeDecodeError: \'utf8\' codec can\'t decode bytes in position 3-6: invalid data
谢谢!! 编辑:以下字符串导致错误:
\'[{\"t\":\"q\",\"s\":\"abh\\xf6ren\"}]\'
\\xf6
应解码为
ö
(abhören)     
已邀请:
        您尝试解析为JSON的字符串未使用UTF-8编码。它很可能是在ISO-8859-1中编码的。请尝试以下操作:
json.loads(unicode(opener.open(...), \"ISO-8859-1\"))
它将处理JSON消息中可能出现的所有变音符号。 您应该阅读Joel Spolsky的《每个软件开发人员绝对,肯定地必须了解Unicode和字符集的绝对最低要求》(无借口!)。我希望它能澄清您在Unicode方面遇到的一些问题。     
        我的解决方案有点有趣,我从未想到过像保存UTF-8编码解码器一样容易。我使用的是notepad ++(v5.6.8)。我没有注意到我用ANSI编码解码器保存了它原来。我正在使用单独的文件来放置所有本地化的字典。我在Notepad ++的\'Encoding \'选项卡下找到了解决方案,然后选择\'在没有BOM的UTF-8中编码\'并保存它。它工作出色。     
        您看到的错误意味着您从远端接收的数据不是有效的JSON。 JSON(根据规范)通常是UTF-8,但也可以是UTF-16或UTF-32(采用大端或小端)。您看到的确切错误意味着部分数据是无效的UTF-8(也不是UTF-16或UTF-32,因为它们会产生不同的错误。) 也许您应该检查从远端收到的实际响应,而不是盲目地将数据传递给“ 5”。现在,您正在将响应中的所有数据读入一个字符串,并假设它是JSON。相反,请检查响应的内容类型。确保该网页实际上声称是在给您JSON,而不是例如不是错误消息的JSON。 (此外,在检查了响应之后,通过将
opener.open()
返回的类似文件的对象传递给
json.load()
,而不是将所有数据读入字符串并将其传递给
json.loads()
。)     
        将编码更改为Latin1 / ISO-8859-1的解决方案解决了我在tex4ht输出上调用html2text.py时观察到的问题。我将其用于LaTeX文档的自动单词计数:tex4ht将它们转换为HTML,然后html2text.py将它们剥离为纯文本,以便通过wc -w进一步计数。现在,例如,如果从文献数据库条目中输入了德语“ Umlaut”,则该过程将失败,因为html2text.py会抱怨例如 UnicodeDecodeError:\'utf8 \'编解码器无法解码位置32243-32245中的字节:无效数据 现在,这些错误随后将变得特别难以追踪,并且从本质上讲,您想在参考部分中加入Umlaut。来自html2text.py内部的一个简单更改 数据= data.decode(编码) 至 数据= data.decode(\“ ISO-8859-1 \”) 解决这个问题;如果您要使用HTML文件作为第一个参数来调用脚本,则还可以将编码作为第二个参数来传递,并保留修改内容。     
        万一有人有同样的问题。我正在将Vim与YouCompleteMe一起使用,无法通过此错误消息启动ycmd,我所做的是:
export LC_CTYPE=\"en_US.UTF-8\"
,问题消失了。     
        将此粘贴到您的命令行上:
export LC_CTYPE=\"en_US.UTF-8\" 
    
        在您的android_suggest.py中,将那条可怕的单行返回语句分解为one_step_at_a_time片段。在某个地方记录“ 11”,以便在发生异常后可以进行检查。结果令人眼前一亮。如果问题不明显,请编辑问题以显示代表。     
        临时解决方法:
unicode(urllib2.urlopen(url).read(), \'utf8\')
-如果返回的是UTF-8,这应该可以工作。
urlopen().read()
返回字节,您必须将其解码为unicode字符串。另外,从http://bugs.python.org/issue4733检查补丁将很有帮助     

要回复问题请先登录注册