如何防止Latin1字符的Unicode表示?

时间:2016-05-30 17:34:20

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

如何防止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;
+----+---------------------+---------------------------------+---------------------+---------------------+
| Id | Titulo              | Aviso                           | Creacion            | Modificacion        |
+----+---------------------+---------------------------------+---------------------+---------------------+
|  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 rows in set (0.00 sec)

JSON

enter image description here

有谁知道如何解决这个问题?

提前致谢;)

1 个答案:

答案 0 :(得分:3)

$this->addElement('text', 'domain', array( 'label' => $this->getTranslator()->_('Your domain'), 'attribs' => array( 'maxlength' => 200, 'size' => 30 ), 'validators' => array(), 'filters' => array(), 'required' => TRUE, 'decorators' => array('Errors', array('HtmlTag', array('tag' => 'span', 'class' => 'custom')) ), )); "Ñ" json字符串表示相同的U+00D1 Unicode字符:

"\u00d1"

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

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

  

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

示例:

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

运行服务器(假设您将其保存到#!/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
@Hareendra Chamara飞利浦在the comment中建议:

  

或者,如果有人使用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": "Ñ" } 并在config.py中执行application.config.from_pyfile('config.py'),则您可以在__init__.py中使用JSON_AS_ASCII = False