我有简单的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
不起作用?
答案 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",
...