Django的JSON和XML fixtures导致UnicodeEncodeError

时间:2013-04-09 18:33:23

标签: python mysql django unicode django-models

我使用Django的dumpdata命令创建了一个JSON文件。当我使用syncdb再次导入数据时,Python会引发异常:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc' in position 231: ordinal not in range(128)

这必须与JSON文件(而不是我的models.py)相关,因为--no-initial-data不会出现问题。现在我想知道我的编码在哪里混淆了。

JSON文件包含'Garc\u00eda Ram\u00f3n'之类的字符串。当我使用UTF-8或Latin1手动编码Python的实际字符串时,我得到:

>>> ustring = u'García Ramón'
>>> ustring.encode('utf-8')
'Garc\xc3\xada Ram\xc3\xb3n'
>>> ustring.encode('latin1')
'Garc\xeda Ram\xf3n'

为什么syncdb会阻塞dumpdata的输出?我该怎么做才能防止这种情况发生?源数据库和目标数据库(分别是MySQL和PostgreSQL)都使用UTF-8。

更新:使用XML作为序列化格式,并使用正确的编码声明时,会发生同样的事情:

<?xml version="1.0" encoding="utf-8"?>
<django-objects version="1.0">
[...]
<field type="CharField" name="last_name">García Ramón</field>

我不知道Django在什么时候尝试使用ascii编解码器编码ü(= u'\xfc')(以及我如何改变它)。我将问题追溯到xml_serializer.py中的第185行:

 self.xml = SimplerXMLGenerator(self.stream, self.options.get("encoding", settings.DEFAULT_CHARSET))

并将DEFAULT_CHARSET='utf-8'添加到settings.py,但现在我被卡住了。

1 个答案:

答案 0 :(得分:1)

你输了吗

#-*- coding: utf-8 -*-

到.py文件的顶部?