Django: 排查DjangoUnicodeDecodeError错误
在尝试渲染一个模板时,我遇到了以下错误:
DjangoUnicodeDecodeError: 'utf8' codec can't decode bytes in position 26-27: invalid data. You passed in '\xce\x88\xce\xbe\xce\xbf\xce\xb4\xce\xb1 \xcf\x83\xcf\x84\xce\xb7\xce\xbd \xce\xb5\xcf\x81\xce\xb3\xce...' (<type 'str'>)
这个模板比较大而且复杂,所以我希望能得到一些建议,帮我找到问题的具体来源。
以下是一些可能有用的事实:
- 这个模板通常对unicode很友好;我们通过它展示了不少unicode数据。
- 数据来源的mysql表使用的是utf8编码。
- 这点很奇怪:在我的测试服务器上,使用相同的代码和生产数据时并没有出现这个错误。这个测试环境和生产服务器非常相似:Python 2.5.1,Django-1.1.1,mysql 5.0.38,ubuntu。
我不太确定该从哪里寻找编码不正确的数据,任何提示或建议都非常感谢。
3 个回答
0
如果有人遇到和我类似的情况:我最近把一个MySQL表的字符集改成了utf8_bin,结果遇到了同样的问题。我发现我在测试环境中使用的是MySQL-python 1.2.3。把它升级到1.2.4后,问题就解决了。我使用的是python2.7和Django1.4.2。
1
异常报告的内容是26个有效的UTF-8字节,后面跟着一个'\xce...'
。
我觉得很可能是你代码中的某个软件,或者是Django框架中的某个部分,正在做类似这样的事情:
def too_big_display(strg, maxlen):
return strg[:maxlen-3] + "..."
在你的情况下,它是用too_big_display(your_Greek_text_encoded_in_utf8,30)
来调用的。
所以你看到的是一个次要错误... \xce.
不是有效的UTF-8。
我建议你仔细查看错误追踪信息(你应该把它展示给我们,还是可以通过编辑你的问题来补充),看看是否有任何主要错误的迹象。如果没有,就仔细检查你的代码,看看是否有这样的截断问题。
4
你在某个地方把一个字符串截断了,但你是在一个 str
类型上操作,而不是 unicode
。这样做会导致你把一个UTF-8字符的序列截断成两半。记住,处理文本时一定要用 unicode
,不要用 str
。