LINUX.ORG.RU

Проблема с кодировкой

 ,


0

2

Помогите понять в где проблема.

Есть джанга с таким кодом:

from django.http import HttpResponse, JsonResponse
from django.views.generic import View
from django.views.decorators.csrf import csrf_exempt

import json
from workers import test

@csrf_exempt
def main(request):
    if request.method == 'POST':
        request_json = json.loads(request.body.decode())

        if request_json['site'] == 'test':
            test_inf = test.get_user_info(request_json['id'])
            return JsonResponse({'test': {'ID': request_json['id'], 'info': test_inf}})

в test.py

def get_user_info(location):
    my_dict = {'responce': 'кирилица'}
    return my_dict

В консоль получаю вот такое

curl -XPOST -d '{"site":"test","id":"1111"}' http://localhost:8000
{"test": {"info": {"responce": "\u043a\u0438\u0440\u0438\u043b\u0438\u0446\u0430"}, "ID": "1111"}}

Отправлял файерфоксом запрос, он кирилицу нормально показывает. Не понимаю, это джангу нужно настраивать или мою консоль.

Питон последний, джанго тоже.

★★★

И что не так-то? :)

console.log(JSON.parse('{"test": {"info": {"responce": "\u043a\u0438\u0440\u0438\u043b\u0438\u0446\u0430"}, "ID": "1111"}}'));
test
    info Object { responce="кирилица"}
        responce "кирилица"
    ID "1111"

znenyegvkby
()
Ответ на: комментарий от znenyegvkby

А, и ведь действительно проблема, не заметил сразу. У вас

\u043a\u0438\u0440\u0438\u043b\u0438\u0446\u0430

А должно быть

\u043a\u0438\u0440\u0438\u043b\u043b\u0438\u0446\u0430

Замените, и ваши волосы снова станут шелковистыми.

znenyegvkby
()
Ответ на: комментарий от znenyegvkby
import requests
import json

r = requests.post('http://127.0.0.1:8000', json={"site": "test", "id": "007"})
print(json.loads(r.text))

Показывает кириллицу. Но как её в констоли увидеть?

GoNaX ★★★
() автор топика
Ответ на: комментарий от GoNaX

Показывает кириллицу.

Конечно показывает. Ибо json.loads _декодирует_ строку в json-объекте.
В вашем же варианте, вы пытаетесь просмотреть еще не декодированный объект.
Ну если уж вам так хочется unescaped unicode (что не является best practice), можете погуглить UnicodeJSONRenderer для джанги, правда я в ней не эксперт.

znenyegvkby
()
Ответ на: комментарий от znenyegvkby

Спасибо.

Главное что всё нормально и это всё приколы линуксовой консоли. Курлом мою программу можно только тестировать, реальный же ответ будет получать как-то софтина.

Если клиент будет недоволен, то попробую поиграться с UnicodeJSONRenderer.

GoNaX ★★★
() автор топика
Ответ на: комментарий от GoNaX

Главное что всё нормально и это всё приколы линуксовой консоли.

Это не проблемы ОС или консоли. Это _нормальный кодированный вариант_ unicode, согласно 4627

http://www.ietf.org/rfc/rfc4627.txt

Any character may be escaped. If the character is in the Basic Multilingual Plane (U+0000 through U+FFFF), then it may be represented as a six-character sequence: a reverse solidus, followed by the lowercase letter u, followed by four hexadecimal digits that encode the character's code point. The hexadecimal letters A though F can be upper or lowercase. So, for example, a string containing only a single reverse solidus character may be represented as «\u005C».

Происходит это, на уровне самого питона, когда вы вызываете JsonResponse

znenyegvkby
()
Ответ на: комментарий от znenyegvkby

Спасибо за ликбез, я раньше не сталкивался с json.

Узнал про существование утилиты json_pp

> curl -XPOST -d '{"site":"test","id":"1111"}' http://localhost:8000 | json_pp 
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   131    0   104  100    27  12656   3285 --:--:-- --:--:-- --:--:-- 13000
Wide character in print at /usr/bin/json_pp line 81, <STDIN> chunk 1.
{
   "test" : {
      "ID" : "1111",
      "info" : {
         "responce" : "кириллица"
      }
   }
}
GoNaX ★★★
() автор топика

Если django 1.9 можешь так:

JsonResponse({'test': {'ID': request_json['id'], 'info': test_inf}}, json_dumps_params={'ensure_ascii': False})

ei-grad ★★★★★
()
Последнее исправление: ei-grad (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.