Почему администратор Django пытается кодировать строки в ASCII, а не в Unicode? Или эта ошибка отличается от той, на которую она похожа? - PullRequest
3 голосов
/ 05 января 2010

У меня следующая ошибка:

TemplateSyntaxError at / Администратор / results_cop / copsegmentresult /

Выявлено исключение при рендеринге: ('ascii', 'ISU European Фигурное катание Чемпионат 2009: Старшие дамы Дамы: короткая программа - 2. Сюзанна P \ xc3 \ x96YKI \ xc3 \ x96 ', 98, 99, 'порядковый номер не в диапазоне (128)')

Фрагмент строки, которая не будет отображаться: PÖYKIÖ

Чего я не понимаю, так это почему Django пытается отобразить строку как ASCII, а не UTF-8?

РЕДАКТИРОВАТЬ 1:

Я забыл спросить - я также очень хотел бы знать, как избавиться от ошибки;)

РЕДАКТИРОВАТЬ 2:

Ответ Бобинса правильный :) У меня было что-то вроде:

def __unicode__(self):
    return "%s %s" (self.foo, self.bar)

Ответы [ 2 ]

7 голосов
/ 05 января 2010

Полагаю, вы просите Django отобразить строку байтов. Нет u в начале этого:

'ISU European Figure Skating Championships 2009: Senior Ladies Ladies: Short Program - 2. Susanna P\xc3\x96YKI\xc3\x96'

Таким образом, Django, вероятно, пытается закодировать его в кодировку страницы, предположительно UTF-8. Но байтовые строки не могут быть закодированы напрямую; сначала они должны быть строками Unicode. Python сам выполняет этот шаг преобразования, используя кодировку по умолчанию, которая обычно ascii.

>>> 'P\xc3\x96YKI\xc3\x96'.encode('utf-8')
UnicodeDecodeError

Итак, вам нужно преобразовать эту байтовую строку в строку Unicode самостоятельно с помощью UTF-8-декодирования, прежде чем она будет отправлена ​​в шаблон. Откуда это взялось? Обычно вы должны стремиться сохранить все строки содержимого внутри вашего приложения в виде строк Unicode.

3 голосов
/ 19 июня 2013

Если кто-то смущен ответом Бобинса, подумайте:

Поля из модели уже в формате Unicode.

когда у вас есть функция Unicode, подобная этой:

def __unicode__(self):
  return "{0}".format(self.field_one)

На самом деле он возвращает строку ASCII (что означает, что он попытается преобразовать field_one в ASCII), если field_one содержит символы вне ASCII, вы получите проблему, как указано выше.

Теперь рассмотрим эту функцию Unicode:

def __unicode__(self):
      return self.field_one

Это прекрасно работает, потому что вы возвращаете строку в юникоде напрямую, преобразование не требуется.

Давайте вернемся к первой функции unicode , чтобы она работала, вам просто нужно добавить u, чтобы сделать ее строкой Unicode

def __unicode__(self):
      return u"{0}".format(self.field_one)
...