кодирование портится при включении ввода файла в форму - PullRequest
2 голосов
/ 13 марта 2011

У меня проблема с кодировкой ввода от элементов формы, которые были испорчены, когда я включил файл ввода в мою форму. Я использую jquery и бэкэнд сервлета (и вызов ajax), но я не понимаю, как это должно иметь к этому отношение. Кодировка HTML-страницы установлена ​​в UTF-8, и я указываю кодировку символов для запроса сервлета, чтобы использовать utf8. Когда я удаляю файл ввода из формы, кодировка в порядке.

Когда я исследую заголовки для запроса, я вижу следующую полезную нагрузку в firebug:

...
------WebKitFormBoundaryMxjJWBwBmPLxN623
Content-Disposition: form-data; name="createActivityTitleInputId"

æøåæøåæøåæøå
...

Содержание ввода должно быть нормальным, и я не знаю, что такое webkitformboundary ...?

Я был бы очень признателен, если бы кто-то мог помочь мне с этой проблемой.

Спасибо:)

----- РЕДАКТИРОВАТЬ ------

Итак, я сделал небольшой тестовый проект, чтобы попытаться сузить проблему. Когда я не использую ajax для публикации формы, все работает нормально. Однако, если я использую плагин формы jQuery для отправки формы, кодирование завершается ошибкой ...

form.ajaxSubmit({ 
        dataType: 'json',
        data: data,
        type: 'POST',
        success: function(response) {
            successfunction(response);
        }
    });

У кого-нибудь есть опыт использования этого плагина?

Ответы [ 3 ]

3 голосов
/ 13 марта 2011

Когда я изучаю заголовки для запроса, я вижу следующую полезную нагрузку в bugzilla:

Вы имеете в виду Firebug?Вы просматриваете вкладку «пост» в журнале «Сеть» в Firebug?

Потому что если это так, то он просматривает всю отправку отправки формы и пытается ее декодировать, включая содержимое любого байта.загруженные файлы - как UTF-8.Если это не удается, он вернется к кодировке по умолчанию для локали, обычно к кодовой странице Windows 1252 (аналогично ISO-8859-1), для отображения содержимого отправки формы.

Это не изменит способ, которым формабыл фактически представлен!Это просто визуализация этого в Firebug.Firebug на самом деле не знает, какую кодировку символов использовали для кодирования содержимого формы, он просто догадывается.Как правило, отправка формы не содержит никакой информации, чтобы сервер (или Firebug) знал, какая кодировка используется.

Таким образом, если вы отправляете форму без загрузки файла или с загрузкой файла, где файлсамо содержимое является допустимой последовательностью UTF-8 (включая любой файл только для ASCII), Firebug отобразит отправку всей формы в формате UTF-8 и, таким образом, отобразит опубликованное содержимое в виде ожидаемых символов.Если, с другой стороны, в байтах файла есть последовательность, которая не является допустимой последовательностью UTF-8 (что весьма вероятно для любого двоичного файла, такого как изображение), Firebug попытается декодировать байты какUTF-8, провал и возврат к cp1252.

Это даст вам отображение «Ã¦Ã¸Ã ¥ æøà ¥ æøà ¥ æøà ¥», Даже если реальный сервер будет читать это как UTF-8 и получать« æøåæøåæøå ».Firebug не знает разницы между значениями отправки текстовой формы (которые являются символами) и содержимым отправки загрузки файла (которые являются байтами; они могут также представлять символы, но в этом случае нет никакой гарантии, что загруженный файл будет использовать ту же кодировкукак форма).

Я не знаю, что такое webkitformboundary вещи ...?

В структуре MIME multipart/ есть граничная строка, котораяразбивает каждую часть.В multipart/form-data каждая часть является полем формы.Строка границы всегда начинается с новой строки, затем --, но тогда в качестве границы выбирается произвольная строка, обычно включающая случайную последовательность символов, которая вряд ли появится в данных самой части.

Строка границы может быть любой, и указывается в параметре Content-Type: multipart/form-data;boundary=.Браузеры WebKit всегда используют граничную строку, начинающуюся с ----WebKitFormBoundary.

1 голос
/ 13 марта 2011

Текст WebKitFormBoundary, похоже, - известная проблема, связанная с Safari - я не уверен, как это применимо, но вот несколько ссылок, которые появились, когда я использовал Google для этого текста:

0 голосов
/ 13 марта 2011

ОК ... поэтому я сделал обходной путьВместо публикации формы с помощью ajaxsubmit я использую функциональность jquery ajax и добавляю каждое значение элементов формы в часть данных запроса ajax вручную.Кажется, это решает проблему.

$.ajax({
        type: 'POST',
        url: action,
        data: params,
        dataType: 'json', 
        success: function(response, textStatus, XMLHttpRequest) {
            successfunction(response);
        }
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...