У меня проблемы с сохранением и выводом символа ndash как UTF-8 в Django.
Я получаю данные из API. В необработанном виде, как получено и просмотрено в текстовом редакторе, данная единица данных может быть похожа на:
"I love this detergent \u2013 it is so inspiring."
(\ u2013 - это html-объект).
Если я получу это прямо из API и выведу его на Django, нет проблем. Это отображается в моем браузере как длинная черта. Я заметил, что мне нужно сделать decode('utf-8')
, чтобы избежать ошибки «кодек ascii не может закодировать символ», хотя я пытаюсь выполнить некоторые операции с этим текстом в моем представлении. Согласно шаблону Django Debug Toolbar, текст идет к шаблону как «Мне нравится это моющее средство. Это так вдохновляет».
При сохранении в MySQL и чтении для вывода через тот же вид и шаблон, в конечном итоге он выглядит как
"I love this detergent – it is so inspiring"
Моя таблица MySQL установлена на DEFAULT CHARSET=utf8
.
Теперь, когда я читаю данные из базы данных через монитор MysQl в терминале, настроенном на Utf-8, он отображается как
"I love this detergent – it is so inspiring"
(правильно - показывает ndash)
Когда я использую mysqldb в оболочке python, эта строка будет
"I love this detergent \xe2\x80\x93 it is so inspiring"
(это правильный UTF-8 для ndash)
Однако , если я запускаю python manage.py shell
, а затем
In [1]: import myproject.myapp.models ThatTable
In [2]: msg=ThatTable.objects.all().filter(thefield__contains='detergent')
In [3]: msg
Out[4]: [{'thefield': 'I love this detergent \xc3\xa2\xe2\x82\xac\xe2\x80\x9c it is so inspiring'}]
Мне кажется, что Django взял \xe2\x80\x93
для обозначения трех отдельных символов и закодировал его как UTF-8 в \xc3\xa2\xe2\x82\xac\xe2\x80\x9c
. Это отображается как «потому что \ xe2, по-видимому,», \ x80, по-видимому, € и т. Д. Я проверил, и это равно , как и его отправка в шаблон.
Если вы декодируете длинную последовательность в Python, однако, с помощью decode('utf-8')
, результат будет \xe2\u20ac\u201c
, который также отображается в браузере как ... Попытка декодировать его снова приводит к UnicodeDecodeError.
Насколько я знаю, я следовал советам Django для Unicode (настроил MySQL).
Любые предложения о том, что я, возможно, неправильно настроил?
addendum Кажется, эта проблема возникла и в других областях или системах. Например, при поиске \ xc3 \ xa2 \ xe2 \ x82 \ xac \ xe2 \ x80 \ x9c я обнаружил в http://pastie.org/908443.txt скрипт для «исправления плохих сущностей UTF8.», также найденный в плагине импорта WordPress RSS. Он просто заменяет эту последовательность на & ndash ;. Я хотел бы решить это правильно, хотя!
О, и я использую Django 1.2 и Python 2.6.5.
Я могу подключиться к той же базе данных с помощью PHP / PDO и распечатать эти данные, не делая ничего особенного, и все выглядит хорошо.