Python编码和JSON转储

12

如果此问题早先已被提出,我深表歉意。我仍然不清楚在python3.2中的编码方式。

我正在阅读一个以UTF-8 w/o BOM编码的csv文件,并且该文件包含法语重音符号。

以下是打开和读取csv文件的代码:

csvfile = open(in_file, 'r', encoding='utf-8')
fieldnames = ("id","locale","message")    
reader = csv.DictReader(csvfile,fieldnames,escapechar="\\") 
for row in reader:
        if row['id'] == id and row['locale'] == locale:
            out = row['message'];

我将消息(out)作为Json返回。

jsonout = json.dumps(out, ensure_ascii=True)    
return HttpResponse(jsonout,content_type="application/json; encoding=utf-8")

然而,当我预览结果时,我发现用重音符号的 e(法文)被替换为 \u00e9。

请问我做错了什么,应该怎么做才能让json输出显示正确的带重音符号的 e 呢?

谢谢。


“然而,当我预览结果时,我发现法语重音字母e被替换为\u00e9。” - 这听起来对我来说是正确的。你有什么问题吗? - poke
如果你在Python中执行print('\u00e9'),它会打印出é,因此表示是正确的。如果你看到的是\u00e9,那只是意味着你所看到的程序不理解这个重音符号。 - Tadhg McDonald-Jensen
httpResponse 将响应打印为 \u00e9。我想知道需要做出什么更改,以便响应打印出带重音的 e。 - tkansara
将UTF-8文本保存为JSON时,使用json.dumps()保留UTF-8而不是Unicode转义字符 - tripleee
2个回答

27

您没有做错任何事情(Python 也没有)。

Python 的 json 模块采用安全路线并转义非 ASCII 字符。这是在 json 中表示此类字符的有效方式,任何符合规范的解析器在解析字符串时都会恢复正确的 Unicode 字符:

>>> import json
>>> json.dumps({'Crêpes': 5})
'{"Cr\\u00eapes": 5}'
>>> json.loads('{"Cr\\u00eapes": 5}')
{'Crêpes': 5}

请不要忘记,JSON 只是您数据的一种表示形式,"ê""\\u00ea" 都是字符串 ê 的有效 JSON 表示形式。符合规范的 JSON 解析器应该能正确处理两者。

但是,您可以禁用此行为,请参阅json.dump 文档

>>> json.dumps({'Crêpes': 5}, ensure_ascii=False)
'{"Crêpes": 5}'

很酷,感谢你的澄清。 - tkansara
@tkansara:如果你真的想改变默认设置,Python 不会阻止你生成完整的 UTF-8。请参见 Saving utf-8 texts in json.dumps as UTF8, not as \u escape sequence - Martijn Pieters

3

关于这个答案, 设置ensure_ascii=False可以在你的打印输出中呈现特殊字符。另一方面, marcelm's answer仍然是正确的,因为在那些编码中没有信息丢失。


将其更改为false会将带重音符号的e替换为é。 - tkansara
有趣。我测试过了,对我来说运行得很好。可能是因为我使用的是Python 3.5。 - Dave J

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接