首页 > 解决方案 > Flask - 如何处理 URL 中的汉字

问题描述

我正在使用 Flask 构建 REST API,但是当我使用汉字传递查询参数时,我得到的是乱码而不是中文

from flask import Blueprint
from flask_restful import Resource, Api

class Keyword(Resource):
    def post(self, keyword):
        return {"keyword": "keyword"}

keyword_api = Blueprint('resourses.keyword', __name__)
api = Api(keyword_api)
api.add_resource(
    Keyword,
    '/keyword/<string:keyword>',
    endpoint='keyword'
)
POST http://localhost:5000/keyword/價錢

我期望 {"keyword": "价钱"} 的输出,但实际输出是 {"keyword": "è²´é\u0081\u008e"}

更新:现在我将它添加到代码中,它正确返回 {"keyword": "价钱"}

keyword = keyword.encode('iso-8859-1').decode('utf8')

标签: pythonflaskcharacter-encodingblueprint

解决方案


代码似乎运行正常。我冒昧地对其进行了一些修改,并将其变成了一个工作示例。需要注意的重要一点是b'{"keyword": "\u50f9\u9322"}'对象类型是由b前缀表示的字节。如果您将此数据从 json 序列化为 python 原生字符串,您会发现它是有效的 ¥ 编码。

from flask import Blueprint, Flask
from flask_restful import Resource, Api
from werkzeug.local import LocalProxy
from logging import DEBUG

app = Flask(__name__)
app.logger.setLevel(DEBUG)
logger = LocalProxy(lambda: app.logger)


class Keyword(Resource):
   def post(self, keyword):
      logger.info("Keyword: {}".format(type(keyword)))
      return {"keyword": keyword}

keyword_api = Blueprint('resourses.keyword', __name__)
api = Api(keyword_api)
api.add_resource(
    Keyword,
    '/keyword/<string:keyword>',
    endpoint='keyword'
)

app.register_blueprint(keyword_api)

推荐阅读