我使用 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'
)(以及我如何改变它)。我将问题追溯到第 185 行xml_serializer.py
:
self.xml = SimplerXMLGenerator(self.stream, self.options.get("encoding", settings.DEFAULT_CHARSET))
并添加DEFAULT_CHARSET='utf-8'
到settings.py
,但现在我被卡住了。