【发布时间】:2013-04-01 08:21:55
【问题描述】:
我使用 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,但现在我卡住了。
【问题讨论】:
标签: python mysql django unicode django-models