Мультипартные / формы-данные, что такое Charset по умолчанию для полей?

StackOverflow https://stackoverflow.com/questions/4085449

Вопрос

Какая кодировка по умолчанию следует использовать для декодирования Multipart / Form-data, если не приведено Charset? RFC2388 Состояния:

4.5 Чарсец текста в виде данных

Каждая часть мультипартных / форм-данных должна иметь тип контента. В случае, когда элемент поля является текстом, параметр Charset для текста указывает, что используемая кодировка символов.

Например, форма с текстовым полем, в котором пользователь набрал «Джо обязанu003Ceu> 100 'гдеu003Ceu> Может ли символ евро мог иметь данные, возвращенные как:

--AaB03x
content-disposition: form-data; name="field1"
content-type: text/plain;charset=windows-1250
content-transfer-encoding: quoted-printable>>

Joe owes =80100.
--AaB03x

В моем случае характерная задача не установлена, и я не знаю, как декодировать данные в этом тексте / простой секции. Поскольку я не хочу принуждать то, что не является стандартным поведением, я спрашиваю, что в этом случае ожидаемое поведение. RFC, похоже, не объясняет это, поэтому я вроде потерял.

Благодарю вас!

Это было полезно?

Решение

Чартакт по умолчанию для Http 1.1. ISO-8859-1 (Latin1), я догадался, что это также относится и здесь.

3.7.1 Канонизация и текст по умолчанию

--snip--

Параметр «Charset» используется с некоторыми типами носителей для определения набора символов (раздел 3.4) данных. Когда ни один изъятовый параметр Charset не предоставляется отправителем, Media Subtypes из типа «Text» определены, чтобы иметь значение Charset по умолчанию «ISO-8859-1» при получении через http. Данные в наборах символов, отличных от «ISO-8859-1» или его подмножеств, должны быть помечены соответствующим значением Charset. См. Раздел 3.4.1 для проблем совместимости.

Другие советы

Это, по-видимому, изменилось в HTML5 (см. http://dev.w3.org/html5/spec-preview/constraints.html#multipart-form-data.).

Части сгенерированного мультипартного / формованного ресурса данных, которые соответствуют нефайловым полям, не должны иметь указанный заголовок типа содержимого.

Итак, где указан набор символов? Насколько я могу сказать из алгоритма кодирования, единственное место находится в форме набора данных формы с именем _charset_.

Если ваша форма не имеет скрытого ввода с именем _charset_, что происходит? Я проверил это в Chrome 28, отправляя форму, закодированную форму в UTF-8 и одну в ISO-8859-1, и проверяя отправленные заголовки и полезную нагрузку, и я не вижу, что придавалось в любом месте (даже если текстовое кодирование определенно изменяется ). Если я включил пустой _charset_ Поле в форме, Chrome заполняет, что с правильным типом Charset. Я думаю, что любой код сервера должен искать это _charset_ поле, чтобы понять это?

Я столкнулся с этой проблемой во время написания расширения Chrome, которое использует XMLHTTPREQUEST. Formdata. объект, который Всегда кодируется в UTF-8 независимо от того, какой кодировщик исходного документа.

Пусть тело объекта запроса будет результатом работы алгоритма кодирования Multipart / Form-Form-Data с данными в качестве набора данных формы, а также с UTF-8 в качестве явного кодирования символов.

Пусть тип MIME будет объединением «мультипартаторов / форм-данных»; «Space Space;», «граница =», а также граничная строка Multipart / Form-Form-Form-Data, генерируемых множественным / формным алгоритмом кодирования данных.

Как я уже нашел ранее, charset = utf-8 не указан нигде в запросе пост, если вы не включите пустой _charset_ Поле в форме, которое в этом случае автоматически наследуется с помощью «UTF-8».

Это мое понимание состояния вещей. Я приветствую любые исправления к моим предположениям!

Благодаря подробному объяснению @owlman.

Только еще несколько информации:

Загрузить запрос фрагмент полезной нагрузки:

------WebKitFormBoundarydZAwJIasnBbGaUqM
Content-Disposition: form-data; name="file"; filename="xxx.txt"
Content-Type: text/plain

Если у «XXX.TXT» есть какой-то Unicode Char в нем, используя кодировку UTF-8, смола (по состоянию на 4.0.40) не может определить ее правильно, но мочевину (9.x) может.

Я думаю, что причина поведения смолы состоит в том, что тип Content не указывает какое-либо кодирование, поэтому имя файла декодирования смолы, используя «ISO8859-1», который может привести к искаженным символам.

Я сделал несколько гугул:

https://mail-archives.apache.org/mod_mbox/struts-user/200310.mbox/%3C3fa0395b.10C3209@kumachan.net.nz%3e.

Кажется, что поведение смолы согласно спецификации сервлета 2.3

И я не могу найти никаких настроек от http://www.caucho.com/resin-4.0/reference.xtp.которые могут изменить это поведение для смолы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top