jQuery $ .get () кодировка ответа, когда заголовок не установлен? - PullRequest
6 голосов
/ 01 декабря 2008

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

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

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

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

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

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

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

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

Сервер: WinampServer
Подключение: закрыть
Тип контента: текст / html

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

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

Ответы [ 3 ]

28 голосов
/ 01 декабря 2008

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

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

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

0 голосов
/ 11 декабря 2008

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

0 голосов
/ 01 декабря 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...