如何在Python Bottle服务端解码encodeURIComponent编码的请求参数?
解决Bottle服务端解析encodeURIComponent编码参数的乱码问题
问题原因
前端用encodeURIComponent编码时,会以UTF-8格式对特殊字符编码,但Bottle默认的查询参数解析逻辑(基于wsgiref)会用Latin-1(ISO-8859-1)解码,导致UTF-8编码的字符出现乱码(比如château变成château)。
两种修复方案
方案1:手动修复已乱码的字符串
如果已经通过request.query.get("q")拿到乱码字符串,可通过反向编码还原:
@app.route("/query") def query(): q = request.query.get("q") # 还原UTF-8编码的原始内容 q_fixed = q.encode('latin-1').decode('utf-8') print(q_fixed) # 输出:c'est un château? Yes & no!
方案2:直接用UTF-8解析查询字符串
绕过Bottle默认解析逻辑,手动用urllib.parse.parse_qs指定UTF-8编码解析原始查询字符串:
from bottle import Bottle, request from urllib.parse import parse_qs app = Bottle("") @app.route("/query") def query(): # 获取原始查询字符串 query_str = request.environ.get("QUERY_STRING", "") # 指定UTF-8编码解析参数 params = parse_qs(query_str, encoding="utf-8") q = params.get("q", [""])[0] print(q) # 输出:c'est un château? Yes & no! app.run()
说明
encodeURIComponent严格遵循UTF-8编码规则,后端必须用UTF-8解码才能正确还原原始内容。方案2更直接,避免了先错误解码再修复的多余步骤。
内容的提问来源于stack exchange,提问作者Basj
相关产品推荐
相关产品推荐

