jQuery $.get() кодировка ответа, когда заголовок не установлен?

Недавно я установил Winamp Song Requester, который представляет собой подключаемый модуль запроса песен Winamp со встроенным минимальный HTTP CGI-сервер.

Что плагин делает, так это то, что он запускает веб-сервер, обслуживает html-страницу с некоторыми специальными переменными, которые он заменяет фактическими данными по запросу (плейлист, очередь запросов, оставшееся время в песне и т. д.).

Я увидел в этом забавный и хороший проект для изучения jQuery, поэтому я начал подключать свой собственный код js, чтобы заменить, исправить и ajaxify обслуживаемый веб-сайт из плагина, но теперь я столкнулся с проблемой с кодировкой символов.

На странице вы получаете ссылки на все песни в плейлисте. Когда вы нажимаете на одну из ссылок, я подключаю свою собственную функцию щелчка jQuery. Поэтому вместо перезагрузки всей страницы, когда вы запрашиваете песню, я делаю $.get($(this).attr('href', function(response) {... code ...}), а затем использую replaceWith, чтобы заменить текущую очередь новой сгенерированной очередью с вашим запросом, добавленным на лету. Я делаю то же самое, чтобы показать/обновить текущую игру и поиск, чтобы все загружалось в фоновом режиме, а затем заменялось на лету добавлением некоторых анимаций.

Все jQuery/Ajax отлично работают, но у меня большая проблема с кодировкой и именами песен в очереди/плейлисте. Специальные символы (рати и т. д.) в именах вообще не работают.

Плагин выводит все в формате iso-8859-1/latin1, а мой метатег в разметке сообщает браузеру, что это страница latin1. При обычном обновлении страницы в браузере это работает хорошо, и специальные символы отображаются как обычно. Но когда я использую jQuery и $.get() для замены блоков кода на лету, специальные символы отображаются только как ?.

Я думаю, что проблема заключается в том, что jQuery по умолчанию считает, что ответ $.get() является UTF-8, если в заголовке не указано иное. Плагин вообще не устанавливает никаких заголовков для кодировки/кодировки, и, поскольку я вообще не контролирую бэкэнд и какие заголовки устанавливаются, я не могу это изменить.

Единственные заголовки, которые я получаю в ответе от плагина:

Сервер: WinampServer
Соединение: close
Content-Type: text/html

Надеюсь, вы понимаете мою проблему. У меня есть страница, на которой я вообще не контролирую серверную часть, и все, с чем мне приходится работать, это сгенерированный HTML. Я не могу изменить или добавить заголовки в ответы. Мне нужно сообщить jQuery, что ответ на самом деле в latin1, а не в UTF-8, чтобы кодировка специальных символов не нарушалась. Я пробовал scriptCharset: 'iso-8859-1' в jQuerys ajaxSetup, но это работает только с типом script/json, и я работаю с ответами HTML.

Любая идея, возможно ли это, или любой другой обходной путь, о котором вы могли бы подумать?


person Daniel Johansson    schedule 01.12.2008    source источник


Ответы (3)


редактировать: хорошо, я думаю, это работает (по крайней мере, это работало в моей тестовой среде, см. изменения для предыдущей попытки)

$.ajaxSetup({
    'beforeSend' : function(xhr) {
        xhr.overrideMimeType('text/html; charset=UTF-8');
    },
});
$('#stuff').load('/yourresource.file'); // your ajax load

у меня был основной файл, установленный в UTF-8, и файл данных, установленный в ISO-8859-1. без приведенного выше кода я получил кучу мусора для тестовой строки åäöé, как и ожидалось. с приведенным выше кодом он загрузил правильно закодированный ruäté.

person Owen    schedule 01.12.2008
comment
Я тоже пробовал это, но это, похоже, не помогает. Я думаю, что это устанавливает только кодировку данных, которые вы отправляете, а не кодировку данных, полученных обратно в ответе. - person Daniel Johansson; 01.12.2008
comment
Вау, спасибо большое-пребольшое. Это работает как шарм. Я был готов сдаться и признать, что решить мою проблему невозможно. Потратил много времени, пробуя разные вещи и гугля в поисках решения. Ваш beforeSend отлично работал, когда я установил кодировку iso-8859-1. - person Daniel Johansson; 02.12.2008
comment
К сожалению, это не работает для IE. Лучшие решения в сообщении SO: ссылка - person Linkmichiel; 30.05.2013

Сначала было бы лучше, если бы вы использовали более общую функцию $.ajax().

Согласно документации существует параметр scriptCharset, однако он применим только в определенные типы данных. Также указано, что это необходимо только в том случае, если кодировка вызывающей страницы отличается.

person kgiannakakis    schedule 01.12.2008

Это просто для того, чтобы указать, что, хотя метод overrideMimeType() доступен в браузерах на основе Gecko (Firefox, ...), его НЕТ в IE (по крайней мере, ‹=7), и, похоже, нет обходного пути. (Я не знаю о доступности в других браузерах.)

person mklement0    schedule 11.12.2008