Django 的 JSON 和 XML 夹具导致 UnicodeEncodeError

Posted

技术标签:

【中文标题】Django 的 JSON 和 XML 夹具导致 UnicodeEncodeError【英文标题】:Django's JSON and XML fixtures cause UnicodeEncodeError 【发布时间】: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,但现在我卡住了。

【问题讨论】:

【参考方案1】:

你放了吗

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

到 .py 文件的顶部?

【讨论】:

这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方发表评论 - 您可以随时评论自己的帖子,一旦您有足够的reputation,您就可以comment on any post。 这个答案也与提出的问题没有任何关系。您无需将此行放入文件中即可处理用户输入或数据文件中的 unicode 数据(除非您直接在代码中使用 Unicode 字符,但问题显然与此无关)

以上是关于Django 的 JSON 和 XML 夹具导致 UnicodeEncodeError的主要内容,如果未能解决你的问题,请参考以下文章

(Django) 安装夹具“rules.json”时出现问题:“NoneType”对象没有属性“id”

由于夹具错误,Django datadump 和 loaddata 无法正常工作

Django Model DateField 和输入夹具

Django 夹具未加载 loaddata

Django 不会为某些测试用例重新加载夹具

为啥我的夹具没有安装在 django 项目上?