Да, да, я знаю, что в наш век все уже давно перешли на использование 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″, после чего всё заработало на ура.
Собственно, мораль сей басни такова - юзайте, люди, юникод, и будет вам счастье.






November 28th, 2008 at 11:34
Юзаем, ага :)
December 2nd, 2008 at 12:15
Ага, уникод рулит :)
January 29th, 2009 at 14:38
Отказался в свое время от cp1251 и вечно бесящих лишних вызовов собственных функций кодировки 1251-utf-8.
Перешел на юникод. Да, размеры увеличились, но это я думаю не страшно.
March 16th, 2010 at 21:18
У меня тоже куча сайтов на 1251 крутится.
Неохота делать вызов iconv на сервере постоянно.
Есть решение этой проблемы:
http://javascript.ru/forum/ajax/8249-reshenie-problemy-kodirovok-dlya-ajax-i-php-bez-iconv-cp1251-v-ajax.html
March 27th, 2010 at 01:43
Все намного проще. Заголовок нужно отдавать такой:
Content-type: text/html; charset=windows-1251
March 27th, 2010 at 01:44
тьфу )) не дочитал )))