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

unicode的东西如何在python2上工作? 我只是没有得到它。

在这里我从服务器下载数据并parsing为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 

谢谢!!

编辑:下面的string导致错误: '[{"t":"q","s":"abh\xf6ren"}]'\xf6应解码为ö (abhören)

您试图parsing为JSON的string不以UTF-8编码。 很可能它是用ISO-8859-1编码的。 尝试以下操作:

 json.loads(unicode(opener.open(...), "ISO-8859-1")) 

这将处理任何可能在JSON消息中的变音。

你应该阅读Joel Spolsky的绝对最小每个软件开发者,肯定地肯定必须知道Unicode和字符集(没有借口!) 。 我希望能够澄清一下你在Unicode中遇到的一些问题。

我的解决scheme有点搞笑。我从来没有想过,它会像UTF-8编解码器一样简单。我使用notepad ++(v5.6.8)。我没有注意到我最初使用ANSI编解码器保存它。 我正在使用单独的文件放置所有本地化字典。 我在Notepad ++的“编码”选项卡下find了我的解决scheme,select'不带BOM的UTF-8编码'并保存。 它工作出色。

您看到的错误意味着您从远程端收到的数据不是有效的JSON。 JSON(根据规范)通常是UTF-8,但也可以是UTF-16或UTF-32(无论是大端还是小端)。您所看到的确切错误意味着某些部分数据不是有效的UTF-8(也不是UTF-16或UTF-32,因为这些会产生不同的错误)。

也许你应该检查你从远端收到的实际响应,而不是盲目地将数据传递给json.loads() 。 现在,您正在将所有来自响应的数据读取到一个string中,并假设它是JSON。 而是检查响应的内容types。 确保网页实际上声称为您提供JSON,而不是,例如, 不是 JSON的错误消息。

(另外,在检查响应之后,通过传递json.load()返回的类文件对象来使用opener.open() ,而不是将所有的数据读入string并传递给json.loads()

将编码更改为Latin1 / ISO-8859-1的解决scheme解决了我在tex4ht的输出中调用html2text.py时遇到的问题。 我使用它在LaTeX文档上自动计算字数:tex4ht将它们转换为HTML,然后将html2text.py剥离为纯文本,以便通过wc -w进一步计数。 现在,例如,如果通过文献数据库条目input德语“变音符号”,则该过程将失败,因为html2text.py会抱怨,例如

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

现在,这些错误随后将特别难以追查,而且基本上你想在你的参考部分中有变音符号。 html2text.py里面一个简单的改变

data = data.decode(编码)

data = data.decode(“ISO-8859-1”)

解决了这个问题; 如果您使用HTML文件作为第一个参数来调用脚本,则还可以将编码作为第二个parameter passing,并且不用修改。

以防万一有人有同样的问题。 我用YouCompleteMe使用vim,未能启动ycmd与此错误消息,我所做的是: export LC_CTYPE="en_US.UTF-8" ,问题已经消失。

将其粘贴到命令行上:

 export LC_CTYPE="en_US.UTF-8" 

在你的android_suggest.py中,将那个可怕的单行返回语句分解成one_step_at_a_time块。 将repr(string_passed_to_json.loads)到某处,以便在发生exception后进行检查。 眼球的结果。 如果问题不明显,请编辑您的问题以显示repr。

临时解决方法: unicode(urllib2.urlopen(url).read(), 'utf8') – 这应该工作, 如果返回的是UTF-8。

urlopen().read()返回字节,你必须将它们解码为unicodestring。 另外从http://bugs.python.org/issue4733检查补丁也是有帮助的;