【问题标题】:How to prevent Unicode representation for Latin1 characters?如何防止 Latin1 字符的 Unicode 表示?
【发布时间】:2016-05-30 17:34:19
【问题描述】:

如何防止 Flask 将拉丁字符作为 Unicode 表示返回?例如,对于这类字符:http://graphemica.com/%C3%91

我的 FlaskApp 在 MySQL 数据库中执行 SELECT,逐行检索,将它们添加到列表中,将列表存储到字典中,最后返回 JSON。

FlaskAPP

@app.route("/json")
def show_json():
    avisos_dict = {}
    records_list = []
    query = "SELECT * FROM tjs_stage.avisos"
    cur.execute(query)
    con.commit()
    records = cur.fetchall()
    for row in records:
        records_list.append(row)
    avisos_dict['avisos'] = records_list
    return jsonify(avisos_dict)

MySQL 数据

mysql> SELECT * FROM tjs_stage.avisos;
+----+----------+---------- ------------+---------------------+---------------- -----+
|身份证 |标题 |阿维索 |创作 |修改 |
+----+----------+---------- ------------+---------------------+---------------- -----+
| 1 | PRIMERO AVISO | MAÑANA EMPIEZAM VACACIONES | 2016-04-06 18:12:52 | 2016-04-06 18:12:52 |
| 64 | Aviso de Vacaciones | Mañana empezam las vacaciones! | 2016-05-30 17:19:17 | 2016-05-30 17:19:17 |
+----+----------+---------- ------------+---------------------+---------------- -----+
2 行(0.00 秒)

JSON


有人知道怎么解决吗?

提前致谢 ;)

【问题讨论】:

  • 生成的 JSON 不仅合法,而且比未转义的版本更不容易受到编码问题的影响。 JSON 是 UTF-8,但并非所有软件都能正确处理它。
  • @Kevin:JSON 是一种 text 格式。它是根据文本(Unicode 代码点序列)定义的。它与可用于将文本编码为字节序列的utf-8 字符编码无关。 utf-8 很常见,它是 application/json content-type 的默认值,用于通过 Internet 传输 json 文本,但没有什么能阻止您在本地磁盘上使用您喜欢的任何字符编码保存 json 文本。

标签: python json unicode flask iso-8859-1


【解决方案1】:

"Ñ""\u00d1" json 字符串代表相同的U+00D1 Unicode 字符:

>>> import json
>>> json.loads(u'"Ñ"') == json.loads(u'"\\u00d1"')
True

注意:反斜杠被转义了,因为它在 Python 字符串文字中也是特殊的。

为避免使用 ascii 编码的 json,set JSON_AS_ASCII to False:

默认情况下,Flask 将对象序列化为 ascii 编码的 JSON。如果这是 设置为 False Flask 将不会编码为 ASCII 并按原样输出字符串 并返回 unicode 字符串。 jsonify 会自动将其编码为 utf-8 然后用于传输。

例子:

#!/usr/bin/env python
from flask import Flask, jsonify

app = Flask(__name__)
app.config['JSON_AS_ASCII'] = False


@app.route('/')
def unicode_json():
    return jsonify({'text': u'\xd1'})


if __name__ == '__main__':
    app.debug = True
    app.run()

运行服务器(假设您将其保存到app.py):

$ python -mpip install flask -U
$ python app.py

测试它:

$ python -mpip install httpie
$ http --pretty=none :5000

输出:

HTTP/1.0 200 OK
Content-Length: 18
Content-Type: application/json
Date: Tue, 31 May 2016 14:54:20 GMT
Server: Werkzeug/0.10.4 Python/2.7.9

{
    "text": "Ñ"
}

@Hareendra Chamara Philips 在the comment 中建议:

或者,如果有人使用config.py 并在__init__.py 中使用application.config.from_pyfile('config.py'),您可以在config.py 中使用JSON_AS_ASCII = False

【讨论】:

  • 说得通,但没用...我仍然没有数据库中的字符。
  • @ivanlmj:“我仍然没有数据库中的字符”——这是什么意思? 1-如果您理解答案,那么您应该了解 json 文本(如您的问题中所示)是 已经正确。 2- 第二部分(关于JSON_AS_ASCII)只是为了您的方便(这样您在调试时可以看到 utf-8 编码的文本而不是 Unicode 转义)。表示不会影响最终结果(解析 json 文本时会得到的 Unicode 对象)。 3-尝试答案中的示例
  • 抱歉,Sebastian.. 也许我没有说清楚... 我有一个 MySQL 数据库,其中的记录包含诸如“ñ”、“í”之类的字符。我想在 JSON 文档中显示这些字符(来自数据库的字符)。现在你举了一个例子,我发现我没有正确配置 JSON_AS_ASCII (感谢这个例子!)。使用正确的参数配置,我收到如下内容:[“Mañana empezam las vacaciones!”].. 我可以从数据库中检索字符(例如ñ),而不是表示是吗?
  • @ivanlmj:第三次:你已经收到了正确的字符。您的问题是它们的显示方式。如果JSON_AS_ASCIIFalse,那么您的环境必须理解utf-8 字符编码。查看答案末尾的输出 - 我已经从我的终端(理解 utf-8)复制粘贴它。如果您的环境不理解 utf-8,则不要将 JSON_AS_ASCII 设置为 False,而是使用 unicode 转义。同样,如果您将 json 文本提供给 json 解析器;无论哪种方式,结果都是相同的。试试看print(requests.get('http://localhost:5000').json()['text'])
  • 我发现浏览器显示的是“ñ”而不是“ñ”...谢谢你,Sebastian!
猜你喜欢
  • 2016-10-22
  • 1970-01-01
  • 2016-03-06
  • 2015-12-31
  • 1970-01-01
  • 2021-06-01
  • 2023-03-14
  • 1970-01-01
相关资源
最近更新 更多