Как кодировка символов задается в запросе HTTP POST multipart/form-data?

спецификация HTML 5 описывает алгоритм для выбора кодировки символов, которая будет использоваться в представлении многосоставной формы (например, UTF-8). Однако неясно, как выбранная кодировка должна передаваться на сервер, чтобы содержимое могло быть правильно декодировано на принимающей стороне.

часто кодировки символов представлены путем добавления параметра "charset" к значению Content-Type заголовок запроса. Однако, этот параметр не отображается будет определено для multipart/form-data тип MIME:

https://tools.ietf.org/html/rfc7578#section-8

каждая часть в представлении составной формы может предоставить свой собственный Content-Type заголовок; однако RFC 7578 отмечает ,что"на практике многие широко развернутые реализации не предоставляют параметр кодировки в каждой части, а скорее полагаются на понятие " кодировка по умолчанию "для экземпляра multipart/form-data".

RFC 7578 продолжает предлагать, что для этого можно использовать скрытое поле формы "_charset_". Однако ни Safari (9.1), ни Chrome (51) не заполняют это поле и не предоставляют никакой информации о кодировке для каждой части.

Я просмотрел заголовки запросов, созданные обоими браузерами, и я не вижу никакой очевидной информации о кодировке символов. Кто-нибудь знает, как браузеры передают эту информацию на сервер?

1 ответов


в HTML 5 используется в RFC 2388 (пересмотрен в RFC 7578), однако в HTML 5 явно снимает из полей файла, а РЛК нет:

части созданного ресурса multipart / form-data, соответствующие полям, не являющимся файлами, не должны иметь указано. Их имена и значения должны быть закодированы с использованием кодировки символов, выбранной выше (имена полей, в частности, не преобразуются в 7-битную безопасную кодировку как предложено в RFC 2388).

RFCs конструированы для того чтобы позволить multipart/form-data для использования в других контекстах, кроме HTML (хотя это его наиболее распространенное использование). В этих других контекстах Content-Type разрешено. Просто не в HTML 5 (но разрешено в HTML 4).

без скрытый _charset_ поле формы, если присутствует, является единственным способом HTML 5 <form> отправитель может явно укажите, какая кодировка используется.

согласно Спецификация алгоритма HTML 5, с которой вы связаны, выбранная кодировка должна быть выбрана из <form> элемент accept-charset атрибут если присутствует, в противном случае будет кодировка, используемая самим HTML, если он совместим с ASCII, в противном случае будет UTF-8. Это явно указано в спецификации алгоритма, а также В разделе 5.1.2 RFC 7578 при обращении к HTML 5.

таким образом, действительно нет необходимости в кодировке явно указано веб-браузером с момента получения формы представление должно знать, какие кодировки ожидать в силу того, как <form> был создан и, таким образом, может проверить эти кодировки при разборе представления. Если получатель хочет знать конкретные charset используется, он должен включать скрытый