Джанго: не-ASCII персонаж - PullRequest
       12

Джанго: не-ASCII персонаж

21 голосов
/ 08 января 2011

Мой Django View / Template не может обрабатывать специальные символы. Простое представление ниже не из-за. Я получаю ошибку ниже:

Не-ASCII символ '\ xf1' в файле "

def test(request):
    return HttpResponse('español')

Есть ли какие-то общие настройки, которые мне нужно установить? Было бы странно, если бы мне приходилось обрабатывать все строки отдельно: неамериканские буквы довольно распространены!

EDIT Это в ответ на комментарии ниже. Это все еще терпит неудачу: (

Я добавил кодовый комментарий к своему представлению и метаинформацию в мой HTML, как это было предложено Габи.

Теперь мой пример выше не выдает ошибку, но неправильно отображается ñ.

Я пытался return render_to_response('tube/mysite.html', {"s": 'español'}). Нет ошибки, но она не отображается (она появляется, если s = hello). Другая информация на html-странице отображается нормально.

Я попытался жестко закодировать 'español' в мой HTML, но это не удалось:

Кодек UnicodeDecodeError 'utf8' не может декодировать байт 0xf.

Я пытался с u перед строкой:

SyntaxError (ошибка Unicode) Кодек utf8 не может декодировать байт 0xf1

Помогает ли это вообще ??

Ответы [ 7 ]

37 голосов
/ 08 января 2011

У вас есть это в начале вашего сценария:

# -*- coding: utf-8 -*-

...?

Смотрите это: http://www.python.org/dev/peps/pep-0263/

РЕДАКТИРОВАТЬ : Вторая проблема касается HTML-кодировки.Поместите это в заголовок вашей html-страницы (вы должны отправить запрос как html-страницу, иначе я не думаю, что вы сможете правильно вывести этот символ):

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
15 голосов
/ 24 сентября 2012

Вставить вверху views.py

# -*- coding: utf-8 -*-

И добавьте "u" перед строкой

my_str = u"plus de détails"

Решено!

8 голосов
/ 08 января 2011

Вам нужен кодовый комментарий, о котором упоминал Габи, а также используйте знак «u» в юникоде перед строкой:

return HttpResponse(u'español')

Лучшая страница, которую я нашел в Интернете, объясняющая весь беспорядок в ASCII / Unicode, это эта: http://www.stereoplex.com/blog/python-unicode-and-unicodedecodeerror

Наслаждайтесь!

3 голосов
/ 09 января 2011

Установите DEFAULT_CHARSET в 'utf-8' в вашем файле settings.py .

0 голосов
/ 15 мая 2015

Суть кодирования заключается в том, что помимо объявления об использовании UTF-8 (через <meta> и файл settings.py проекта) вы, конечно, должны уважать вашу декларацию: убедитесь, что ваши файлы сохранены с использованием UTF-8 кодировка.

Причина проста: вы указываете переводчику выполнять ввод-вывод с использованием определенной кодировки.Если вы не сохранили свои файлы с этой кодировкой, интерпретатор будет потерян.

Некоторые IDE и редакторы будут использовать Latin1 (ISO-8859-1) по умолчанию, что объясняет, почему Райан может ответить своим ответом.Хотя это не верное решение исходного вопроса, но это быстрое решение.

0 голосов
/ 05 мая 2015

ref from: https://docs.djangoproject.com/en/1.8/ref/unicode/

"Если ваш код использует только данные ASCII, можно безопасно использовать ваши обычные строки, передавая их по желанию, поскольку ASCII является подмножеством UTF-8.

Не думайте, что если для вашего параметра DEFAULT_CHARSET установлено значение, отличное от 'utf-8', вы можете использовать эту другую кодировку в своих строках байтов! DEFAULT_CHARSET применяется только к строкам, сгенерированным в результате рендеринга шаблона(и электронная почта). Django всегда будет принимать кодировку UTF-8 для внутренних байтовых строк. Причина этого заключается в том, что параметр DEFAULT_CHARSET фактически не находится под вашим контролем (если вы являетесь разработчиком приложения). Он находится под контролем лица, устанавливающего ииспользуя ваше приложение - и если этот человек выберет другой параметр, ваш код все равно должен продолжать работать. Поэтому он не может полагаться на этот параметр.

В большинстве случаев, когда Django имеет дело со строками, он преобразует ихUnicode строк, прежде чем делать что-либо еще. Итак, как правилоЕсли вы передадите байтовую строку, будьте готовы получить строку Unicode в результате. "

0 голосов
/ 27 сентября 2011

Я боролся с той же проблемой, что и @dkgirl, но, несмотря на внесение всех предложенных здесь изменений, я все еще не мог получить постоянные строки, которые я определил в settings.py, которые содержат - чтобы отображаться на страницах, отображаемых из моегошаблоны.

Вместо этого я заменил каждый экземпляр "utf-8" в своем коде на python из приведенных выше решений на " ISO-8859-1 " (Latin-1).Теперь работает нормально.

Странно, поскольку, кажется, все указывает на то, что ñ поддерживается utf-8 (и фактически я все еще использую utf-8 в своих шаблонах).Возможно, это проблема только в старых версиях Django?Я использую 1.2 beta 1.

Есть еще идеи, что могло вызвать проблему?Вот мой старый след:Traceback (последний вызов был последним):Файл "manage.py", строка 4, вИмпорт настроек # Предполагается, что находится в том же каталоге.Файл "C: \ dev \ xxxxx \ settings.py", строка 53('es', ugettext (u'Espa ± ol ')),SyntaxError: (ошибка Unicode) кодеку utf8 не удается декодировать байт 0xf1 в позиции 0: неожиданный конец данных

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...