3

Здравствуйте. Возникла проблема с кодировкой. Получаю JSON и не могу его декодировать в Русский текст. Данные такого формата: \u0413\u0440\u0430\u0439\u0440. Как преобразовать их в русский текст? decode("utf-8") не работает, unichr и char тоже... Использую python 2.7

Получаю данные так:

response = urllib.urlopen('Ссылка') #получение json
data = json.loads(response.read()) #Обработка JSOn запроса
jfs
  • 52,361
Diq
  • 521
  • 1
    А какой версией питона вы пользуетесь? – Александр Зинин Dec 23 '16 at 05:10
  • использую python 2.7 – Diq Dec 23 '16 at 05:56
  • Посмотрите тут: http://ru.stackoverflow.com/questions/487400/%D0%9F%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%D0%B4-%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%BE%D0%B3%D0%BE-%D1%82%D0%B5%D0%BA%D1%81%D1%82%D0%B0-%D0%B8%D0%B7-%D0%BA%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8-unicode-python/487417#487417. Возможно, и сам сайт криво отдает. – andy.37 Dec 23 '16 at 08:30
  • 1
    Вы уверены, что это именно данные такие, а не просто сам питон экранирует строку при печати для вашего терминала? Как вы проверяете, какие даннве записаны? – andreymal Dec 23 '16 at 08:36

3 Answers3

2

Ничего не надо делать. data уже Юникодные строчки с русским текстом содержит.

#!/use/bin/env python2
import json
from urllib2 import urlopen 

data = json.load(urlopen(url))
print data['text']

Наиболее вероятной причиной, по которой вы видите \u0440 вместо р в Питоне 2, является печать контейнера вместо строки. К примеру если type(data['text']) == list:

>>> print [u'\u0440']
[u'\u0440']
>>> print repr(u'\u0440')
u'\u0440'
>>> print [u'\u0440'][0]
р
>>> print u'\u0440'
р

Связано:


Если type(data['text']) является unicode, но вы всё равно видите \u0413\u0440 на экране вместо Гр, то либо данные неверно генерируются (посмотрите на print repr(urlopen(url).read())—не должны \\u видеть, правильно только один слэш, а не два), либо печать Unicode в вашем окружении так сконфигурирована (проверьте значение PYTHONIOENCODING переменной окружения—ascii:backslashreplace может Г в \u0413 превратить). Вот примеры ввода/вывода Unicode в Питоне 2.

О \u в json cм. ещё ответ на связанный вопрос: Json ответ в "неправильной кодировке" отображает русские символы.

\u экранирование используется для представления Unicode символов как в JSON формате так и в текстовом представлении unicode строк в Питоне.

jfs
  • 52,361
0

Я делал так, используя opener. Это кусочек из проекта на Python 3, так что не уверен, но в основном оно выглядит так:

# -*- coding: utf-8 -*-
import urllib.request, http.cookiejar, requests, json
cj = http.cookiejar.CookieJar()
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
content = json.loads(opener.open(urllib.request.unquote("ссылка")).read().decode('utf-8'))

В итоге json должен содержать кириллицу.

  • в python 2.7 нет urllib.request точнее модуля request в urllib – Diq Dec 23 '16 at 07:36
0

попробуйте так:

>>> print '\u0413\u0440\u0430\u0439\u0440'.replace('\u','\\u').decode('unicode-escape')
Грайр
Vladimir
  • 279
  • 1
  • 8