Nov 28

Да, да, я знаю, что в наш век все уже давно перешли на использование utf-8 при построении веб-сайтов, но остались еще и такие, которые пользуються “допотопными”, “отстойными”, и вообще “не-тру” кодировками типа CP1251 (также известной как Windows-1251), KOI8-R и прочих.

Ни для кого ни секрет, что кодировкой получаемых через Ajax данных по-умолчанию принимается UTF-8. Не все знают, что это умолчание можно изменить, указав кодировку явно через заголовок “Content-Type: text/html; charset=cp1251″. Сегодня вот столкнулся с интересным багом, на который убил довольно много времени.

Сервер отдает некоторый текст по запросу (ajax) в кодировке CP1251, предварительно установив соответствующий заголовок - “Content-Type: text/html; charset=cp1251″. На клиенте использовалась библиотека jQuery:

$('#books').load('books.php', {action: 'list'});

Всё работало замечательно… До тех пор, пока я не открыл страничку в IE7. Как ни странно, но ничего не загрузилось. После длительных раздумий, установки alert-ов куда нужно, и куда нет код был заменен следующим кодом:

$.ajax({
  method: 'get',
  url: 'books.php',
  success: function(data) {
    $('#books').html(data);
  },
  error: function(xhr, textStatus, errorThrown) {
    alert(textStatus);
  },
  data: {action: 'list'}
});

В FF всё продолжало работать, а вот IE начал выдавать странную надпись “parsererror”. Гугление никаких результатов не дало - ни одного похожего случая… После, примерно, 10 минут попыток “запустить” страничку в IE, что-то меня дернуло посмотреть на серверный код. Глаза сразу упали на строку установки Content-Type-а. Недолго думая, я поставил charset=utf-8, и, о чудо, IE загрузил всё как положено (правда в неправильной кодировке, но всё же - уже плюс). Догадавшись в чем может быть дело, я установил кодировку в “windows-1251″, после чего всё заработало на ура.

Собственно, мораль сей басни такова - юзайте, люди, юникод, и будет вам счастье.

written by fxposter \\ tags: , ,


6 Responses to “jQuery, AJAX и CP1251”

  1. 1. igorekk Says:

    Юзаем, ага :)

  2. 2. adw0rd Says:

    Ага, уникод рулит :)

  3. 3. sasha_tinkoff Says:

    Отказался в свое время от cp1251 и вечно бесящих лишних вызовов собственных функций кодировки 1251-utf-8.
    Перешел на юникод. Да, размеры увеличились, но это я думаю не страшно.

  4. 4. serge Says:

    У меня тоже куча сайтов на 1251 крутится.
    Неохота делать вызов iconv на сервере постоянно.

    Есть решение этой проблемы:
    http://javascript.ru/forum/ajax/8249-reshenie-problemy-kodirovok-dlya-ajax-i-php-bez-iconv-cp1251-v-ajax.html

  5. 5. OLEX Says:

    Все намного проще. Заголовок нужно отдавать такой:

    Content-type: text/html; charset=windows-1251

  6. 6. OLEX Says:

    тьфу )) не дочитал )))

Leave a Reply