Flask - Как работать с китайскими иероглифами в URL - PullRequest
1 голос
/ 03 мая 2019

Я использую 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/價錢

Я ожидал вывода ключевого слова {"":" 價錢 "}, но фактическим выводом является {" ключевое слово ":" è²´é \ u0081 \ u008e "}

Обновление: сейчас я добавил это в код, оно возвращает {" ключевое слово ": "價錢"} правильно

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

Ответы [ 2 ]

1 голос
/ 03 мая 2019

Код, кажется, работает правильно. Я позволил себе немного изменить его и превратить в рабочий пример. Важно отметить, что 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)
0 голосов
/ 03 мая 2019

Тип 'utf-8', но декодируется как 'iSO-8859-1', поэтому есть искаженные символы. Данные Bytes были декодированы в Str на 'iso-8859-1'. Когда вы закодировали его как 'iso-8859-1', оно снова вернулось к Bytes данным, затем расшифровало его как utf-8, и результат был правильным. Это изменение между различными типами кодирования / декодирования. Вы можете установить тип декодирования на utf-8, если найдете соответствующие параметры.

...