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”