То, что 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-отклик в различных кодировках.
Да, именно этот эффект я обнаружил прикручивая script.aculo.us к сайту. )
Про header не догадался, просто перекодировал win1251 в UTF
Спасибо, оказалось очень полезным!
Столкнулась с такой же проблемой. Но мне нужно отправить POST форму с сайта (через AJAX), который в CP1251. Изменить кодировку сайта не могу (не подвластно). Что делать в таком случае?
Спасибо - очень помогло!