AJAX та проблеми з кодуванням

Головна » Блог »AJAX та проблеми з кодуванням.

Дуже часто розробники у тих чи інших ситуаціях стикаються з проблемами, пов'язаними з кодуванням. Особливо ті, хто працює у кодуванні windows-1251. Сьогодні хотів розглянути цю проблему, подивитися різні приклади та можливі рішення.

AJAX (Asynchronous Javascript and XML, асинхронний Javascript і XML) дуже тісно увійшов у побуті, і важко уявити собі сучасний сайт без використання цієї технології. По суті, аякс – це фоновий обмін даними, що дозволяє отримувати дані без перезавантаження сторінки. Різні " живі пошуки " , реєстрації, форми зворотний зв'язок тощо.

Через AJAX ми можемо передавати дані методом POST та GET. Давайте розберемося, які можуть бути проблеми передачі цих даних.

Навіщо з GET.

Коли ми передаємо дані через GET – це означає, що ми надсилаємо скрипту URL, в якому український текст має бути закодований, у певній послідовності. Називається вона escape-послідовністю.

У цьому GET запиті query передає фразу "український текст". Але escape-послідовності відрізняються один від одного, залежно від кодування, що використовується. Для того щоб перевести український текст у послідовність, W3C рекомендує використовувати функцію "encodeURIComponent()", яка автоматично переводить текст у utf-8 і створює escape-послідовність. Тому при передачі тексту через Jquery, Prototype та інші фреймворки, на виході ми отримуємо текст у UTF-8 кодуванні. Якщо ви працюєте в кодуванні Windows-1251, то доведеться спочатку текст перекласти з utf-8 в Windows-1251 (це можна зробити через iconv, наприклад: $_GET['query'] = iconv('utf-8', 'Windows- 1251, $_GET['query'])).

З теорієюзакінчили, тепер розглянемо приклади. Є один цікавий нюанс, який я виявив. Я працював з фреймворком Jquery, сайт працює в utf-8, обробник ajax запитів працює в utf-8, база даних працює в utf-8, коротше всі вузли сайту побудовані в цьому кодуванні. Розраховуючи на те, що Jquery надсилає запит через encodeURIComponent(), я його не використовував. Та й у принципі ніяких проблем не було, поки не стали приходити запити з "каказябрами", при тому що Firefox, Chrome і Opera коректно надсилали запити в utf-8, але Internet Explorer, як найвидатніший браузер, примудрявся надсилати запити у windows -1251.

Я вирішив провести тест і розібратися при яких ситуаціях IE посилає неправильне кодування.

Так ось, перевіривши обидва, я з'ясував, що в $.ajax IE посилає не UTF-8, а Windows-1251. Вирішення цієї проблеми – додати encodeURIComponent() і все буде добре.

Добре, із GET запитами розібралися.

Тепер розглянемо коротко POST.

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

Але це не так страшно, тому що у нас завжди є можливість перекласти кодування і вже працювати з даними. При цьому віддавати результати ми можемо в нашому улюбленому кодуванні, головне не забувайте ставити заголовок із зазначенням кодування, якщо раптом ви назад отримуєте "каказябри".

Висновок: для того, щоб не булоПроблеми з кодуванням при передачі даних через AJAX необхідно використовувати encodeURIComponent(). Якщо ваш серверний скрипт, який приймає запити, працює в іншому кодуванні, відмінному від utf-8, то треба користуватися функцією php iconv і встановлювати заголовок header.