Ajax и кодировки символов

То, что UTF-8 шагает по планете, мы все прекрасно знаем и все прекрасно понимаем какие преимущества мы получаем и каких проблем мы можем избежать используя универсальную кодировку, вместо национальной. Множество сервисов, систем и технологий de facto используют UTF-8 в качестве кодировки символов по умолчанию и попросту не умеют работать с национальными кодировками.

Все мы знаем (а те, кто не знает сейчас узнают), что Ajax для обмена данными использует только кодировку UTF-8. Что же делать, если на сайте используется другая кодировка и возможности изменить её нет? А вот что…

Работая над одним из проектов (а точнее над одной из его частей) мне потребовалось выполнить некий Ajax-запрос, возвращающий текст, который должен быть внесён в один из контейнеров на странице. Страница, как я уже сказал, была в национальной кодировке, а именно в кодировке windows-1251, возвращаемый текст также был в кодировке windows-1251, но текст появляющийся в контейнере представлял собой смесь вопросительных знаков с цифрами и латиницей (если они конечно присутствовали). Подобное безобразие появлялось как в Firefox под управлением ОС Linux, так и в Internet Explorer под Windows.

Первое решение, пришедшее мне в голову было простым и, как мне показалось верным. В начале Ajax-отклика отправить соответствующий HTTP-заголовок:

header('Content-Type: text/html; charset: windows-1251');

Да, этот способ решил проблему, но только в тестовом скрипте (о нём чуть позже), а не в проекте, над которым я работал. Почему? — Не знаю… Так же, как я узнал, данный способ не всегда корректно работает в Internet Explorer.

Способ второй немного сложнее и не такой логичный, но в то же время — он верный и работает. Способ заключается в том, чтобы перекодировать Ajax-отклик в кодировку UTF-8:

header('Content-Type: text/html; charset: utf-8');
$responce = iconv('windows-1251', 'UTF-8', $responce);
echo $responce;

Ну и наконец тестовый скрипт, который выводит Ajax-отклик в различных кодировках.

4 комментариев к записи «Ajax и кодировки символов»


  1. Иконка граватара 1 Alexander

    Да, именно этот эффект я обнаружил прикручивая script.aculo.us к сайту. )
    Про header не догадался, просто перекодировал win1251 в UTF

  2. Иконка граватара 2 Андрей

    Спасибо, оказалось очень полезным!

  3. Иконка граватара 3 Toivonen

    Столкнулась с такой же проблемой. Но мне нужно отправить POST форму с сайта (через AJAX), который в CP1251. Изменить кодировку сайта не могу (не подвластно). Что делать в таком случае?

  4. Иконка граватара 4 Alex

    Спасибо - очень помогло!

  1. 1 My hacking life at Stranger than Fiction
    Пингбэк отправлен 15 September:РП: 2007 года в 03:43

Оставить комментарий