Как кодировка символов задается в запросе 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 используется, он должен включать скрытый