【问题标题】:Encoding error while deserializing a json object from Google反序列化来自 Google 的 json 对象时出现编码错误
【发布时间】:2010-12-07 13:46:02
【问题描述】:

作为练习,我构建了一个查询 Google Suggest JSON API 的小脚本。代码很简单:

query = 'a'
url = "http://clients1.google.co.jp/complete/search?hl=ja&q=%s&json=t" %query
response = urllib.urlopen(url)
result = json.load(response)
UnicodeDecodeError: 'utf8' codec can't decode byte 0x83 in position 0: invalid start byte

如果我尝试read() 响应对象,这就是我得到的:

'["a",["amazon","ana","au","apple","adobe","alc","\x83A\x83}\x83]\x83\x93","\x83A\x83\x81\x83u\x83\x8d","\x83A\x83X\x83N\x83\x8b","\x83A\x83\x8b\x83N"],["","","","","","","","","",""]]'

因此,当 python 尝试解码字符串时,会引发错误。这只发生在 google.co.jp 和日语中。我用不同的国家/语言尝试了相同的代码,但我没有遇到同样的问题:当我尝试反序列化对象时,一切正常。

  • 我检查了响应标头,它们总是将 utf-8 指定为响应编码。
  • 我使用在线解析器 (http://json.parser.online.fr/) 检查了 JSON 字符串,所有接缝都正常

有解决这个问题的想法吗?是什么让 JSON load() 函数阻塞?

提前致谢。

【问题讨论】:

    标签: python json encoding


    【解决方案1】:

    响应头(print response.header)包含以下信息:

    Content-Type: text/javascript; charset=Shift_JIS
    

    注意字符集。

    如果您在json.load 中指定此编码,它将起作用:

    result = json.load(response, encoding='shift_jis')
    

    【讨论】:

    • 你的问题是:JSON 不应该在 Shift_JIS 中传输:JSON 唯一有效的编码是 UTF-*。此外,text/javascript 的实际内容类型很奇怪。此外,当我使用 Firefox 打开该 URL 时,我会得到相同的响应,但使用的是 UTF-8。
    • @Thanatos Google 似乎对 User-Agent 字符串进行了检查。如果您使用通用浏览器用户代理字符串(使用 IExplorer 6、Firefox 3、Safari.. 测试)对该 URL 发出请求,您将获得以 UTF-8 编码的响应。我不知道为什么。
    • @Raben:我在想它实际上可能是“Accept-Encoding”标头——Firefox 似乎明确地请求 ISO-8859-1 或 UTF-8 格式的结果,而 urllib 没有。无论如何,给 urllib 的答案是错误的。
    【解决方案2】:

    不管规范怎么说,字符串 "\x83A\x83}\x83]\x83\x93" 不是 UTF-8。

    猜测是 [ "cp932", "shift_jis", "shift_jis_2004", "shift_jisx0213" ];尝试解码为其中之一。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多