Проблеми с AJAX и кодиране.

Начало "Блог" Проблеми с AJAX и кодиране.

Много често разработчиците в определени ситуации се сблъскват с проблеми, свързани с кодирането. Особено тези, които работят в Windows-1251 кодиране. Днес исках да разгледам този проблем, да видя различни примери и възможни решения.

AJAX (асинхронен Javascript и XML, асинхронен Javascript и XML) се превърна в много разпространена употреба и е трудно да си представим модерен уебсайт, без да използваме тази технология. Всъщност ajax е фонов обмен на данни, който ви позволява да получавате данни, без да презареждате страницата. Различни „търсения на живо“, регистрации, форми за обратна връзка и т.н.

Чрез AJAX можем да прехвърляме данни, използвайки методите POST и GET. Нека да видим какви проблеми може да има при прехвърлянето на тези данни.

Нека започнем с GET.

Когато прехвърляме данни чрез GET, това означава, че изпращаме на скрипта URL, в който руският текст трябва да бъде кодиран, в определена последователност. Нарича се евакуационна последователност.

В тази GET заявка заявката предава фразата „руски текст“. Но изходните последователности се различават помежду си в зависимост от използваното кодиране. За да се преведе руски текст в последователност, W3C препоръчва използването на функцията "encodeURIComponent ()", която автоматично преобразува текста в utf-8 и създава екранираща последователност. Следователно, когато прехвърляме текст чрез Jquery, Prototype и други рамки, получаваме текста в UTF-8 кодиране на изхода. Ако работите в кодиране на Windows-1251, първо ще трябва да преведете текста от utf-8 в Windows-1251 (това може да стане чрез iconv, например: $ _GET ['query'] = iconv ('utf-8 ',' Windows- 1251 ', $ _GET [' заявка '])).

След като теорията завърши, сега нека разгледаме примери. Има един интересен нюанс, който открих. Работих с рамката Jquery, сайтът работи в utf-8, обработващият заявките ajax работи в utf-8, базата данни работи в utf-8, накратко, всички възли на сайта са вградени в това кодиране. Разчитайки на факта, че Jquery изпраща заявката чрез encodeURIComponent (), не я използвах. И по принцип нямаше проблеми, докато не започнаха да идват заявки с "kakazyabra", въпреки факта, че Firefox, Chrome и Opera правилно изпращаха заявки в utf-8, но Internet Explorer, като най-забележителният браузър, успя да изпрати заявки до windows -1251.

Реших да направя тест и да разбера в какви ситуации IE изпраща грешно кодиране.

И така, след като проверих и двете, разбрах, че в $ .ajax IE не изпраща UTF-8, а Windows-1251. Решението на този проблем е да добавите encodeURIComponent () и всичко ще се оправи.

Добре, справихме се с GET заявки.

Сега нека да разгледаме набързо POST.

За разлика от GET заявките, тип Content се предава в POST, който съобщава на сървърния скрипт информация за това с какви данни работи и възможността за задаване на кодирането. Например в Jquery по подразбиране AJAX предава "application/x-www-form-urlencoded; charset = UTF-8", но дори ако посочите „text/html; charset = windows-1251 ", тогава данните, които влизат, ще бъдат в utf-8, тъй като при прехвърляне на данни Jquery генерира екранираща последователност, функцията, която е написана по-горе.

Но това не е толкова страшно, защото винаги имаме възможност да преведем кодирането и вече работим с данните. В същото време можем да дадем резултатите в любимото ни кодиране, най-важното е да не забравяме да поставим заглавието, посочвайки кодирането, ако изведнъж се върнете "kakazyabry".

Заключение: за да избегнете проблеми с кодирането, когато прехвърляте данни чрез AJAX, трябва да използвате encodeURIComponent (). Ако вашият скрипт от страна на сървъра, който приема заявки, работи в различно кодиране от utf-8, тогава трябва да използвате php функцията iconv и да зададете заглавката.