Удваивает Django, кодирующего Unicode (utf-8?) строка?

Я испытываю затруднения при хранении и выводе 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 и распечатать эти данные, не делая ничего специального, и это выглядит хорошо.

6
задан JAL 4 June 2010 в 07:21
поделиться

2 ответа

Это действительно похоже на случай двойного- кодирование; У меня нет большого опыта работы с 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

, вероятно, то, что вам нужно.

1
ответ дан 17 December 2019 в 22:11
поделиться

Я добавил имена наборов utf8 в свою последовательность вставки данных php, и теперь в оболочке Python пугающий ndash отображается как \ x96. Это правильно отображается при чтении и выводе через Django.

Одна необычная ситуация, связанная с этим, заключается в том, что я вставляю данные через PHP.Django выдает устанавливает имена utf8 автоматически, поэтому, вероятно, если бы я вставлял и читал данные через Django, эта проблема не возникла бы. PHP использовал по умолчанию latin1, я полагаю

Интересное примечание, хотя раньше я мог читать данные из PHP, и они нормально отображались в браузере, теперь ndash - это �, если я не вызываю набор имен перед чтением данных.

Итак, теперь это работает, и я надеюсь, что мне никогда не придется понимать, что происходило раньше!

0
ответ дан 17 December 2019 в 22:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: