Ошибка кодирования при десериализации объекта json из Google - PullRequest
1 голос
/ 07 декабря 2010

В качестве упражнения я создал небольшой скрипт, который запрашивает API Google Suggest 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"],["","","","","","","","","",""]]'

Так что кажется, что ошибкаПоднимается, когда Python пытается декодировать строку.Это происходит только с google.co.jp и японским языком.Я пробовал один и тот же код с разными странами / языками, и у меня не возникает та же проблема: когда я пытаюсь десериализовать объект, все работает нормально.

  • Я проверил заголовки ответа, и они всегда указывают utf-8 в качестве кодировки ответа.
  • Я проверил строку JSON с помощью онлайн-анализатора (http://json.parser.online.fr/) и снова все швыОК

Есть какие-нибудь идеи для решения этой проблемы? Что заставляет функцию JSON load() подавиться?

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 07 декабря 2010

Заголовок ответа (print response.header) содержит следующую информацию:

Content-Type: text/javascript; charset=Shift_JIS

Обратите внимание на кодировку.

Если вы укажете эту кодировку в json.load, она будет работать:

result = json.load(response, encoding='shift_jis')
0 голосов
/ 07 декабря 2010

Независимо от того, что сказано в спецификации, строка "\ x83A \ x83} \ x83] \ x83 \ x93" не является UTF-8.

По предположению, это одна из ["cp932", "shift_jis", "shift_jis_2004", "shift_jisx0213"];Попробуйте расшифровать как один из них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...