Spec-Zone.ru › Werkzeug 2.1

Unicode

Werkzeug использует строки внутри везде, где предполагаются текстовые данные, даже если стандарт HTTP не поддерживает Unicode. В основном все входные данные декодируются из кодировки символов (по умолчанию UTF-8), чтобы вы не работали напрямую с байтами. Выходные данные кодируются в целевую кодировку символов.

Unicode в Python

Представьте, что у вас есть немецкая умлаут ö. В ASCII вы не можете представить этот символ, но в latin-1 и utf-8 наборах символов вы можете его представить, но они выглядят по-разному при кодировании:

>>> "ö".encode("latin1")
b'\xf6'
>>> "ö".encode("utf-8")
b'\xc3\xb6'

У ö вид различается в зависимости от кодировки, что затрудняет работу с ним как с байтами. Вместо этого Python рассматривает строки как текстовые данные Unicode и хранит информацию LATIN SMALL LETTER O WITH DIAERESIS вместо байтов для ö в определенной кодировке. Длина строки с 1 символом будет 1, где длина байтов может быть другим значением.

Unicode в HTTP

Однако спецификация HTTP была написана во времена, когда байты ASCII были распространенным способом представления данных. Чтобы обойти это для современного веб-приложения, Werkzeug автоматически декодирует и кодирует входные и выходные данные. Данные, отправленные из браузера в веб-приложение, декодируются из байтов UTF-8 в строку. Данные, отправленные от приложения обратно в браузер, кодируются обратно в UTF-8.

Обработка ошибок

Функции, выполняющие внутреннюю кодировку или декодирование, принимают ключевой аргумент errors, который передается в str.decode() и str.encode(). Значение по умолчанию — 'replace', чтобы ошибки было легко обнаружить. Может быть полезно установить его на 'strict', чтобы поймать ошибку и сообщить о плохих данных клиенту.

Объекты запроса и ответа

В большинстве случаев вы должны придерживаться стандартной кодировки UTF-8 Werkzeug. Если у вас есть особая причина, вы можете создать подклассы wrappers.Request и wrappers.Response для изменения кодировки и обработки ошибок.

from werkzeug.wrappers.request import Request
from werkzeug.wrappers.response import Response

class Latin1Request(Request):
    charset = "latin1"
    encoding_errors = "strict"

class Latin1Response(Response):
    charset = "latin1"

Обработку ошибок можно изменить только для запроса. Werkzeug всегда будет генерировать ошибки при кодировании в байты в ответе. Вы несете ответственность за то, чтобы не создавать данные, которых нет в целевой кодировке символов. Это не проблема для UTF-8.

© 2007–2022 Pallets
Licensed under the BSD 3-clause License.
https://werkzeug.palletsprojects.com/en/2.1.x/unicode/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API