问题描述
|
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 183,in JSONObject
value,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检查补丁将很有帮助