DjangoUnicodeDecodeError和force_unicode

时间:2010-09-26 14:05:22

标签: django unicode django-admin

我有简单的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

使用英文文本添加新消息(在管理员页面中)可以正常工作但是当我尝试使用俄语文本添加新闻时出现错误:

  

/ admin / news / newsentry /

中的TemplateSyntaxError      

渲染时捕获DjangoUnicodeDecodeError:'ascii'编解码器无法解码位置0中的字节0xd0:序号不在范围内(128)。你传递了NewsEntry:[错误的Unicode数据](类'antek.news.models.NewsEntry')

     

Django版本:1.2.2

     

异常类型:TemplateSyntaxError

     

异常值:渲染时捕获DjangoUnicodeDecodeError:'ascii'编解码器无法解码位置0中的字节0xd0:序号不在范围内(128)。你传递了NewsEntry:[错误的Unicode数据](类'antek.news.models.NewsEntry')

     

异常位置:/usr/local/lib/python2.6/dist-packages/django/utils/encoding.py in> force_unicode,第88行

     

Python版本:2.6.5

追溯列表中的最后一项是:

  

/usr/local/lib/python2.6/dist-packages/django/utils/encoding.py in 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在blog application中使用类似的代码。

我花了很多时间来解决这个问题,并找到了一个奇怪的解决方案:

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

但是由于self.title是unicode对象,force_unicode应该返回它而不做任何更改。

为什么return self.title不起作用?

3 个答案:

答案 0 :(得分:5)

问题在于MySQL服务器中的utf8_bin排序规则。完整信息here.

答案 1 :(得分:0)

force_unicode可能会丢失数据。如果您知道所获得的数据类型,那么简单地使用Python的解码方法来正确转换数据就更为现实了。这可以通过“latin1”字符串(例如)轻松完成,如下所示:

my_unicode_string = my_latin1_string.decode('latin1')

答案 2 :(得分:0)

我的情况更为宽松,我是从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'>)

但是从数据库中检索它并再次运行代码没有问题,因此如果您遇到包含[Bad Unicode data]的Django错误的问题,请尝试在保存为解决方法后重新检索对象。< / p>

    ...
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", 
...