Дамп данных Django UTF-8 (Юникод)
Вопрос
Есть ли простой способ сбросить UTF-8 данные из базы данных?
Я знаю эту команду:
manage.py dumpdata > mydata.json
Но данные, которые я получил в файле mydata.json, данные Unicode, выглядят так:
"name": "\u4e1c\u6cf0\u9999\u6e2f\u4e94\u91d1\u6709\u9650\u516c\u53f8"
Я хотел бы увидеть настоящую строку Unicode, например 全球卫星定位系统
(Китайский язык).
Решение
django-admin.py дамп данных вашего приложения мог бы свалить для этой цели.
Или, если вы используете MySQL, вы можете использовать mysqldump команда для дампа всей базы данных.
И эта тема имеет множество способов сброса данных, включая ручные методы.
ОБНОВЛЯТЬ:потому что ОП отредактировал вопрос.
Чтобы преобразовать строку кодировки JSON в удобочитаемую строку, вы можете использовать это:
open("mydata-new.json","wb").write(open("mydata.json").read().decode("unicode_escape").encode("utf8"))
Другие советы
После борьбы с подобными проблемами я только что обнаружил, что форматтер xml правильно обрабатывает UTF8.
manage.py dumpdata --format=xml > output.xml
Мне пришлось перенести данные из Django 0.96 в Django 1.3.После многочисленных попыток с данными дампа/загрузки мне наконец удалось использовать xml.Побочных эффектов на данный момент нет.
Надеюсь, это кому-то поможет, так как я зашел в эту ветку, когда искал решение.
Вам нужно либо найти вызов json.dump*()
в коде Django и передайте дополнительную опцию ensure_ascii=False
а затем закодируйте результат после, или вам нужно использовать json.load*()
чтобы загрузить JSON, а затем сбросить его с этой опцией.
Здесь я написал фрагмент для этого.Работает для меня!
import codecs
src = "/categories.json"
dst = "/categories-new.json"
source = codecs.open(src, 'r').read().decode('string-escape')
codecs.open(dst, "wb").write(source)
Вы можете создать свой собственный сериализатор, который передает ensure_ascii=False
аргумент для json.dumps
функция:
# serfializers/json_no_uescape.py
from django.core.serializers.json import *
class Serializer(Serializer):
def _init_options(self):
super(Serializer, self)._init_options()
self.json_kwargs['ensure_ascii'] = False
Затем зарегистрируйте новый сериализатор (например, в вашем приложении). __init__.py
файл):
from django.core.serializers import register_serializer
register_serializer('json-no-uescape', 'serializers.json_no_uescape')
Затем вы можете запустить:
manage.py dumpdata --format=json-no-uescape > output.json
просто оставь это здесь:
./manage.py dumpdata --indent=2 core.item | python3 -c "import sys; sys.stdout.write(sys.stdin.read().encode().decode('unicode_escape'))" > core/fixtures/item.json