Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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) по умолчанию, что объясняет, почему Райан мог ответить. Хотя это не действительное решение первоначального вопроса, заданного, но быстрое исправление.