DjangoUnicodeDecodeError и force_unicode - PullRequest
       13

DjangoUnicodeDecodeError и force_unicode

5 голосов
/ 26 сентября 2010

У меня есть простая модель ввода новостей Django:

class NewsEntry(models.Model):
    pub_date = models.DateTimeField('date published')
    title = models.CharField(max_length = 200)
    summary = models.TextField()
    content = models.TextField()

def __unicode__(self):
    return self.title

Добавление новых новостей (на странице администратора) с английским текстом работает нормально, но когда я пытаюсь добавить новости с русским текстом, возникает ошибка:

TemplateSyntaxError в / admin / news / newsentry /

Обнаружено DjangoUnicodeDecodeError при рендеринге: кодек «ascii» не может декодировать байт 0xd0 в позиции 0: порядковый номер не в диапазоне (128)Вы передали в NewsEntry: [Плохие данные Unicode] (класс 'antek.news.models.NewsEntry')

Версия Django: 1.2.2

Тип исключения: TemplateSyntaxError

Значение исключения: поймал DjangoUnicodeDecodeError при рендеринге: кодек «ascii» не может декодировать байт 0xd0 в позиции 0: порядковый номер не в диапазоне (128).Вы прошли в NewsEntry: [Плохие данные Unicode] (класс 'antek.news.models.NewsEntry')

Местоположение исключения: /usr/local/lib/python2.6/dist-packages/django/utils/encoding.py в> force_unicode, строка 88

Версия Python: 2.6.5

Последний элемент в списке отслеживания:

/ usr /local / lib / python2.6 / dist-packages / django / utils / encoding.py в force_unicode

Локальные переменные:

e: UnicodeDecodeError ('ascii', '\ xd0 \ xa2 \xd0 \ xb5 \ xd1 \ x81 \ xd1 \ x82 \ xd1 \ x80 \ xd1 \ x83 \ xd1 \ x81 \ xd1 \ x81 \ xd0 \ xba \ xd0 \ xbe \ xd0 \ xb3 \ xd0 \ xbe ', 0, 1,'порядковый номер не в диапазоне (128) ')

Код выглядит правильно: self.title - это объект Unicode.Кроме того, djangoproject.com использует подобный код в своем блог-приложении .

Я трачу много времени на решение этой проблемы и нашел странное решение:

from django.utils.encoding import force_unicode
# ...
def __unicode__(self):
    return force_unicode(self.title)

Но из-заself.title - это объект Unicode, force_unicode должен вернуть его без изменений.

Почему return self.title не работает?

Ответы [ 3 ]

5 голосов
/ 22 ноября 2010

Проблема в сопоставлении utf8_bin на сервере MySQL.Полная информация здесь.

0 голосов
/ 11 июня 2013

Моя ситуация была еще более необычной, я импортировал данные из файла JSON, экземпляр, созданный в памяти, генерировал бы Unicode следующим образом:

DjangoUnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 21: ordinal not in range(128). You passed in <Company: [Bad Unicode data]> (<class 'companies.models.Company'>)

Но извлечение его из базы данных и повторный запуск кода работалибез проблем, поэтому, если у вас возникла проблема, при которой вы получаете ошибку Django, содержащую [Bad Unicode data], попробуйте повторно извлечь объект после сохранения в качестве обходного пути.

    ...
company.save()
company = Company.objects.get(pk=company.pk) # avoiding bizarre [Bad Unicode data] error
logger.info("Company (locality exists) '{0}' created".format(company))
...

Если кто-то захочет правильно объяснитьпочему не стесняйтесь - я думаю, что входные данные не кодируются в UTF-8:

...
"address_city": "Dolbeau-Mistassini", 
"name": "Bleuets Mistassini Lt\u00e9e", 
...
0 голосов
/ 27 сентября 2010

force_unicode имеет потенциал потери данных.Если вы знаете тип данных, которые вы получаете, гораздо реалистичнее просто использовать метод декодирования Python для правильного преобразования данных.Это легко сделать с помощью строки 'latin1' (например), например:

my_unicode_string = my_latin1_string.decode ('latin1')

...