使用 Flask 的 jsonify 将 é 显示为 é

Rod*_*MPE 3 python json utf-8 flask python-3.x

jsonify('\xc3\xa9')没有打印出我期望的内容。相反\xc3\xa9,我明白了\xc3\x83\xc2\xa9

\n\n
app = Flask(__name__)\napp.config['JSON_AS_ASCII'] = False\n\n@app.route('/')\ndef test():\n    return jsonify('\xc3\xa9')\n
Run Code Online (Sandbox Code Playgroud)\n\n

脚本的编码是UTF-8。UTF-8 JSON 编码应该由JSON_AS_ASCII = False.

\n

dav*_*ism 5

您正在查看转储数据的表示形式。由于您已禁用JSON_AS_ASCII,您将获得两个 UTF-8 字节,而不是 ASCII 兼容的 Unicode 转义。无论您选择哪种表示形式,JSON 仍然是 UTF-8,但坚持使用默认值通常更安全。

\n\n

无论您使用什么方式查看数据,都会将字节误解为 Latin-1,而不是 UTF-8。告诉您正在查看的数据是 UTF-8,并且它看起来是正确的。从 JSON 加载数据,你会发现它仍然是正确的。

\n\n
from flask import Flask, jsonify, json\n\napp = Flask(\'example\')\napp.config[\'JSON_AS_ASCII\'] = True  # default\n\nwith app.app_context():\n    print(jsonify(\'\xc3\xa9\').data)  # b\'"\\\\u00e9"\\n\', Unicode escape\n\napp.config[\'JSON_AS_ASCII\'] = False\n\nwith app.app_context():\n    print(jsonify(\'\xc3\xa9\').data)  # b\'"\\xc3\\xa9"\\n\', UTF-8 bytes\n\n# you\'re viewing the bytes as Latin-1\nprint(b\'\\xc3\\xa9\'.decode(\'latin1\'))  # \xc3\x83\xc2\xa9\n\n# but it\'s UTF-8\nprint(b\'\\xc3\\xa9\'.decode(\'utf8\'))  # \xc3\xa9\n\n# JSON is always UTF-8\nprint(json.loads(b\'"\\\\u00e9"\\n\')  # \xc3\xa9\nprint(json.loads(b\'"\\xc3\\xa9"\\n\')  # \xc3\xa9\n
Run Code Online (Sandbox Code Playgroud)\n