Я испытываю затруднения при хранении и выводе ndash символа как UTF-8 в Django.
Я получаю данные из API. В необработанной форме, как получено и просматривается в текстовом редакторе, учитывая единицу информации может быть подобно:
"I love this detergent \u2013 it is so inspiring."
(\u2013 и ndash; как объект HTML).
Если я получаю это прямо от API и отображаю его в Django, без проблем. Это отображается в моем браузере как длинный тире. Я заметил, что должен сделать decode('utf-8')
избегать "кодека 'ASCII' не может закодировать символьную" ошибку, если я пытаюсь сделать некоторые операции с тем текстом, по моему мнению, все же. Текст идет в шаблон как, "Я люблю этот detergent\u2013, это так вдохновляюще". согласно Панели инструментов Django Debug.
При хранении к MySQL и читайте для вывода посредством того же представления и шаблона, однако, это заканчивает тем, что было похоже
"I love this detergent – it is so inspiring"
К столу My 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).
Какие-либо предложения на том, что я, возможно, неправильно сконфигурировал?
приложение Это кажется этой той же проблемой, неожиданно возникло в других областях или системах также., как при поиске \xc3\xa2\xe2\x82\xac\xe2\x80\x9c, я нашел по http://pastie.org/908443.txt, что сценарий 'восстановил плохие объекты UTF8'. также найденный в импорте RSS Wordpress включают. Это просто заменяет эту последовательность –. Я хотел бы решить это правильный путь, хотя!
О, и я использую Django 1.2 и Python 2.6.5.
Я могу соединиться с той же базой данных с PHP/PDO и распечатать эти данные, не делая ничего специального, и это выглядит хорошо.
Это действительно похоже на случай двойного- кодирование; У меня нет большого опыта работы с Python, но попробуйте настроить параметры подключения MySQL в соответствии с советом на http://tahpot.blogspot.com/2005/06/mysql-and-python-and-unicode.html
Я предполагаю, что это соединение latin1, поэтому MySQL пытается снова закодировать строку перед сохранением в поле UTF-8. Код там, а именно этот бит:
РЕДАКТИРОВАТЬ: С Python при установке подключение к базе данных добавьте следующее флаг: init_command = 'УСТАНОВИТЬ ИМЕНА utf8'.
Кроме того, в MySQL my.cnf: набор символов по умолчанию = utf8
, вероятно, то, что вам нужно.
Я добавил имена наборов utf8
в свою последовательность вставки данных php, и теперь в оболочке Python пугающий ndash отображается как \ x96. Это правильно отображается при чтении и выводе через Django.
Одна необычная ситуация, связанная с этим, заключается в том, что я вставляю данные через PHP.Django выдает устанавливает имена utf8
автоматически, поэтому, вероятно, если бы я вставлял и читал данные через Django, эта проблема не возникла бы. PHP использовал по умолчанию latin1, я полагаю
Интересное примечание, хотя раньше я мог читать данные из PHP, и они нормально отображались в браузере, теперь ndash - это �, если я не вызываю набор имен
перед чтением данных.
Итак, теперь это работает, и я надеюсь, что мне никогда не придется понимать, что происходило раньше!