【问题标题】:Python encoding and json dumpsPython 编码和 json 转储
【发布时间】:2016-02-23 16:12:04
【问题描述】:

如果之前有人问过这个问题,我深表歉意。我仍然不清楚python3.2中的编码。

我正在阅读一个 csv(以 UTF-8 编码,不带 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'];

我将消息(输出)作为 Json 返回

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

但是,当我预览结果时,我发现重音 e(French) 被替换为 \u00e9 。

您能否就我做错了什么以及我应该怎么做以使 json 输出显示正确的带重音的 e 提出建议。

谢谢

【问题讨论】:

  • “但是,当我预览结果时,我发现重音 e(French) 被 \u00e9 替换了。” – 这听起来不错。你有什么问题?
  • 是的,如果您在 python 中执行print('\u00e9'),它会打印出é,因此表示是正确的。如果你看到\u00e9,那只是意味着你看到它的程序不理解口音。
  • httpResponse 将响应打印为 \u00e9。我想知道我需要进行哪些更改才能使响应打印出带重音的 e。

标签: python python-3.x encoding


【解决方案1】:

您没有做错任何事(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 documentation

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

【讨论】:

【解决方案2】:

对于这个answer,设置ensure_ascii=False 会在打印输出中呈现特殊字符。另一方面,marcelm's answer 仍然是正确的,因为在这些编码中不会丢失任何信息。

【讨论】:

  • 更改为 false 将 é 替换为带重音符号的 e。
  • 有趣。我对其进行了测试,对我来说效果很好。可能是,我使用了 python 3.5。
猜你喜欢
  • 1970-01-01
  • 2021-03-28
  • 2013-06-25
  • 1970-01-01
  • 2021-04-04
  • 1970-01-01
  • 1970-01-01
  • 2015-04-22
  • 1970-01-01
相关资源
最近更新 更多