2010-12-07 10 views
1

作爲練習,我構建了一個查詢Google Suggest JSON API的小腳本。該代碼非常簡單:反序列化來自Google的json對象時的編碼錯誤

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"],["","","","","","","","","",""]]' 

所以接縫,當蟒蛇試圖解碼引發錯誤字符串。這隻會發生在google.co.jp和日語。我試着用不同的contry /語言編寫相同的代碼,我不要得到相同的問題:當我嘗試反序列化對象時,一切正常。

  • 我檢查了響應頭,他們總是指定utf-8作爲響應編碼。
  • 我查了JSON字符串以在線分析器(http://json.parser.online.fr/),並再次所有接縫OK

任何想法來解決這個問題?是什麼讓JSON load()功能窒息?

在此先感謝。

回答

3

的響應報頭(print response.header)包含以下信息:

Content-Type: text/javascript; charset=Shift_JIS 

注意的字符集。

如果在json.load指定此編碼它的工作:

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

存在您的問題:JSON永遠不應該在Shift_JIS中傳輸:唯一有效的JSON編碼是UTF- *。而且,`text/javascript`的實際內容類型很奇怪。另外,當我用Firefox打開該URL時,我得到了相同的響應,但使用UTF-8。 – Thanatos 2010-12-07 15:34:34

0

無論規範說什麼,字符串 「\ x83A \ X83} \ X83] \ X83 \ X93」 是不是UTF-8 。

有人猜測,它是[「cp932」,「shift_jis」,「shift_jis_2004」,「shift_jisx0213」];嘗試解碼爲其中之一。