Python Flask API Get端点非ASCII字符处理问题求助
解决Python 3.6 Flask API中瑞典语字符显示为问号的问题
我来帮你搞定这个编码坑!Python 3和Python 2的编码机制差异确实容易踩雷,结合你的情况,咱们一步步排查解决:
1. 先确认curl的请求是否正确传递编码后的参数
首先用curl -v命令查看实际发送的请求URL,确保瑞典语字符已经被正确编码为UTF-8的URL格式:
curl -v "http://localhost:5000/api/getdata/?name=ÅÄÖ"
正常情况下,请求行应该显示类似:
GET /api/getdata/?name=%C3%85%C3%84%C3%96 HTTP/1.1
如果看到乱码或者其他编码格式,说明你的终端编码不是UTF-8,先执行export LC_ALL=en_US.UTF-8把终端编码切换为UTF-8。
2. 在Flask视图函数中修复参数编码
Python 3下Flask默认会用latin-1解码URL参数,这会导致UTF-8编码的特殊字符变成问号。你可以在获取参数时手动重新解码:
# -*- coding: utf-8 -*- from flask import Flask, request app = Flask(__name__) # 如果需要返回包含特殊字符的JSON响应,开启这个配置 app.config['JSON_AS_ASCII'] = False @app.route('/api/getdata/') def get_data(): name = request.args.get('name') if name: # 重新编码修复:先转成latin-1字节,再用UTF-8解码 name = name.encode('latin1').decode('utf-8') print("收到的name参数:", name) return {'name': name} if __name__ == '__main__': app.run(debug=True)
3. 确保Python输出环境支持UTF-8
有时候后端打印显示问号不是参数解码的问题,而是Python的标准输出编码不支持UTF-8。启动Flask应用前设置环境变量:
export PYTHONIOENCODING=utf-8 python your_app.py
这样print()输出特殊字符时就不会变成问号了。
为什么Python 2.7能正常工作?
Python 2默认的字符串处理是字节流,你之前添加的配置(比如# -*- coding: utf-8 -*-加上sys.setdefaultencoding('utf-8'))强制了全局编码为UTF-8,刚好适配了curl传递的参数编码。但Python 3已经改用Unicode字符串,反而需要针对URL参数的解码逻辑做调整。
内容的提问来源于stack exchange,提问作者danielo
相关产品推荐
相关产品推荐

