2010-09-26 77 views
5

我有新聞條目的簡單的Django模型:DjangoUnicodeDecodeError和force_unicode

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 at /admin/news/newsentry/

Caught DjangoUnicodeDecodeError while rendering: 'ascii' codec can't decode byte 0xd0 in position 0: ordinal not in range(128). You passed in NewsEntry: [Bad Unicode data] (class 'antek.news.models.NewsEntry')

Django Version: 1.2.2

Exception Type: TemplateSyntaxError

Exception Value: Caught DjangoUnicodeDecodeError while rendering: 'ascii' codec can't decode byte 0xd0 in position 0: ordinal not in range(128). You passed in NewsEntry: [Bad Unicode data] (class 'antek.news.models.NewsEntry')

Exception Location: /usr/local/lib/python2.6/dist-packages/django/utils/encoding.py in >force_unicode, line 88

Python Version: 2.6.5

在回溯列表中的最後一項是:

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

Local vars:

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, 'ordinal not in range(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

我不認爲'self.title'是一個Unicode對象。根據錯誤,它是一個字節字符串(包含UTF-8西裏爾字母)。你是如何得到這個字符串的?通常閱讀表單提交應該給你Unicode。 – bobince 2010-09-26 14:52:31

+0

是的,我同意。但是,當我在__unicode__方法中寫入類似「return self.title.foo()」的東西時,在保存新聞時存在AttributeError:「'unicode'對象沒有屬性'foo'」。 – Kirill 2010-09-26 15:17:12

回答

5

問題是在MySQL服務器utf8_bin歸類:這可以很容易地與一個 'latin1的' 字符串(例如)像這樣完成的。全部信息here.

0

force_unicode帶有丟失數據的可能性。如果您知道所獲得的數據類型,那麼只需使用Python的解碼方法來正確轉換數據就更加實際。

my_unicode_string = my_latin1_string.decode( 'LATIN1')

0

我的情況更是paculiar,我是從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錯誤,請嘗試在保存爲解決方法後重新檢索對象。

... 
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", 
... 
相關問題