Подтвердить что ты не робот

Проблема с кодировкой символов в запросах POST, отправленных с помощью Firefox

Недавно я столкнулся с очень странным поведением, связанным с кодировкой символов для вызовов AJAX, выполненных с использованием метода POST. Короче говоря, у меня есть HTML-форма с текстовыми полями, которые могут принимать диакритические знаки (например, " ä" ). Когда форма отправляется, данные формы обертываются в блок XML и отправляются на сервер, который хранит эту информацию в базе данных MySQL. Впоследствии эта информация извлекается из базы данных и отображается обычным пользователям, как есть.

Если запрос отправлен из Chrome или IE, все в порядке. Это означает, что данные, включая диакритические знаки, отправляются, сохраняются, затем извлекаются и отображаются правильно. Тем не менее, когда я использую Firefox для этого, XML, похоже, правильно передает данные формы, но когда я перезагружаю веб-страницу, ранее отправленные диакритики не появляются. Другими словами, они, кажется, теряются где-то на этом пути. Например, если XML содержит слово "tästä", когда я загружаю страницу, я вижу "tst".

Почему это происходит? Является ли Firefox кодировкой почтовых сообщений по-разному от IE и Chrome?

В случае, если это помогает, я привязал заголовки запросов и ответов от Chrome и Firefox для точно такого же содержимого формы - только один пример:

Кстати, я не кодирую данные перед отправкой на сервер, просто получая значение полей формы, как есть.

ХРОМ:

Блок данных XML:

<request>
<session>{hidden by me}</session>
<builder>Hem i Stan tästä</builder>
</request>

Заголовки запросов:

Accept:*/*
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Content-Length:562
Content-Type:application/x-www-form-urlencoded
Cookie:PHPSESSID=rlne2d787j0np52ec5rtn04dm1
Host:83.150.87.220
Origin:http://hidden.by.me
Referer:http://http://hidden.by.me/?c=2094211
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1
X-Requested-With:XMLHttpRequest

Заголовки ответов:

Connection:Keep-Alive
Content-Encoding:gzip
Content-Type:application/xml
Date:Mon, 17 Sep 2012 16:21:58 GMT
Keep-Alive:timeout=5, max=100
Server:Apache/2.2.11 (Win32) PHP/5.2.9-1
Transfer-Encoding:chunked
Vary:Accept-Encoding

FIREFOX:

Блок данных XML:

<request>
<session>{hidden by me}</session>
<builder>Hem i Stan tästä</builder>
</request>

Заголовки запросов:

Accept  */*
Accept-Encoding gzip, deflate
Accept-Language en-us,en;q=0.5
Connection  keep-alive
Content-Length  562
Content-Type    application/x-www-form-urlencoded; charset=UTF-8
Cookie  PHPSESSID=kvfg4fp2trorllim19dmn241c7
Host    hidden.by.me
Referer http://hidden.by.me/?c=2094211
User-Agent  Mozilla/5.0 (Windows NT 6.1; WOW64; rv:14.0) Gecko/20100101 Firefox/14.0.1
X-Requested-With    XMLHttpRequest

Заголовки ответов:

Connection  Keep-Alive
Content-Encoding    gzip
Content-Type    application/xml
Date    Mon, 17 Sep 2012 16:21:23 GMT
Keep-Alive  timeout=5, max=100
Server  Apache/2.2.11 (Win32) PHP/5.2.9-1
Transfer-Encoding   chunked
Vary    Accept-Encoding
4b9b3361

Ответ 1

Как уже упоминалось @Pointy, проблема была связана с Content-Type запроса POST, поскольку Firefox, похоже, кодирует сообщения POST по-другому, чем другие браузеры. В моей голове Data-Type и Content-Type были одинаковыми, и поэтому я не осознал необходимости указывать UTF-8 как стандарт кодировки символов в обоих случаях. Но как только я изменил и Content-Type и Data-Type, а также на ясный "text/xml; charset = UTF-8", проблема была решена.

Ответ 2

Я счастлив. Спасибо, ребята, за публикацию и выяснение этого раньше. Мне потребовалось пару часов, чтобы подобраться достаточно близко к проблеме, чтобы найти это через googling, но из-за ваших комментариев я решил это решить менее чем за день; и вовремя для большой презентации завтра!:)

Это было так странно, что все браузеры отправляли одну и ту же строку данных в запросе AJAX, но получали разные результаты, в зависимости от браузера (Firefox отличается).

Я пробовал это, но это не сработало:

req.setRequestHeader( "encoding", "utf-8" );

Затем я просто сделал то, что сказал Firefox, и одно решение для кодирования работает во всех браузерах.

req.setRequestHeader( "Content-type", "application/x-www-form-urlencoded; charset = utf-8" );

Я тестировал Chrome, MSIE, Firefox, Safari, Opera и Opera Next. Работает каждый раз!