Проблема с кодировкой символов в запросах 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
Ответы
Ответ 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. Работает каждый раз!