Django: символ не-ASCII
My Django View/Template не может обрабатывать специальные символы. Простой вид ниже терпит неудачу из-за. Я получаю ниже ошибки:
Не-ASCII-символ '\ xf1' в файле
def test(request):
return HttpResponse('español')
Есть ли какая-то общая настройка, которую мне нужно установить? Было бы странно, если бы мне пришлось обрабатывать все строки отдельно: неамериканские буквы довольно распространены!
ИЗМЕНИТЬ
Это в ответ на комментарии ниже. Он все еще не работает: (
Я добавил комментарий к коду моему представлению и метаинформации в свой html, как предположил Габи.
Теперь мой пример выше не дает ошибки, но отображается неверно.
Я попробовал return render_to_response('tube/mysite.html', {"s": 'español'})
. Нет ошибки, но она не вылетает (это происходит, если s = привет). Другая информация на странице html отображается нормально.
Я пробовал hardcoding 'español' в свой HTML, и это не удается:
UnicodeDecodeError 'utf8' кодек не может декодировать байт 0xf.
Я попытался с u перед строкой:
SyntaxError (unicode error) 'utf8' кодек не может декодировать байт 0xf1
Помогает ли это вообще?
Ответы
Ответ 1
У вас есть это в начале вашего script:
# -*- coding: utf-8 -*-
...
Смотрите это: http://www.python.org/dev/peps/pep-0263/
EDIT. Для второй проблемы это касается кодировки html. Поместите это в начало страницы html (вы должны отправить запрос как html-страницу, иначе я не думаю, что вы сможете правильно вывести этот символ):
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Ответ 2
Вставьте вверху views.py
# -*- coding: utf-8 -*-
И добавьте "u" перед вашей строкой
my_str = u"plus de détails"
Решено!
Ответ 3
Вам понадобится комментарий к кодировке, упомянутый Габи, а также используйте знак "u" в unicode перед вашей строкой:
return HttpResponse(u'español')
Лучшая страница, которую я нашел в Интернете, объясняющую весь беспорядок ASCII/Unicode:
http://www.stereoplex.com/blog/python-unicode-and-unicodedecodeerror
Наслаждайтесь!
Ответ 4
Установите DEFAULT_CHARSET в 'utf-8'
в файле settings.py.
Ответ 5
Я боролся с той же проблемой, что и @dkgirl, но, несмотря на внесение всех изменений, предложенных здесь, я все еще не мог получить постоянные строки, которые я определил в settings.py, которые содержат - чтобы отображаться на страницах, сделанных из моего шаблоны.
Вместо этого я заменил каждый экземпляр "utf-8" в моем коде python из приведенных выше решений на " ISO-8859-1" (латинский-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 error) 'utf8' кодек не может декодировать байт 0xf1 в позиции 0:
неожиданный конец данных
Ответ 6
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 не находится под вашим контролем (если вы разработчик приложения). Его под контролем человека, устанавливающего и использующего ваше приложение, - и если этот человек выбирает другую настройку, ваш код должен продолжать работать. Ergo, он не может полагаться на эту настройку.
В большинстве случаев, когда Django имеет дело со строками, он преобразует их в строки Unicode, прежде чем делать что-либо еще. Итак, как правило, если вы передаете байтовую строку, будьте готовы получить строку Unicode в результате. "
Ответ 7
Дело в кодировании заключается в том, что помимо объявления использования UTF-8 (через <meta>
и файла проекта settings.py
), вы должны уважать свое выражение: убедитесь, что ваши файлы сохранены с помощью UTF- 8.
Причина проста: вы говорите интерпретатору о выполнении ввода-вывода с использованием определенной кодировки. Если вы не сохранили файлы с этой кодировкой, интерпретатор потеряется.
Некоторые IDE и редакторы будут использовать Latin1 (ISO-8859-1) по умолчанию, что объясняет, почему Райан мог ответить. Хотя это не действительное решение первоначального вопроса, заданного, но быстрое исправление.