Принудительное кодирование, используемое в запросе XHR

В разрабатываемом расширении для браузера я делаю XHR-запрос на загрузку некоторых данных, используя jQuery:

$.get(url).done(function(data, textStatus) {
    console.log(data);
})

Удаленно загружаемые данные - это CSV-файл в кодировке Windows-1252, который поставляется с Content-disposition: вложением и без заголовка mime-type / charset (у меня нет контроля над бэкэндом, поэтому я не могу это исправить).

Как я могу заставить браузер декодировать ответ как windows-1252 вместо utf-8, как это, по-видимому, в настоящее время происходит?

4 ответа

Решение

Как подсказывают мои предыдущие исследования и первые ответы, я не смог найти способ сделать то, что хотел, используя jQuery. Я обошел эту проблему, используя ванильный XMLHttpRequest с responseType=blob, как объяснено в https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Sending_and_Receiving_Binary_Data

var oReq = new XMLHttpRequest();
oReq.open("GET", url, true);
oReq.responseType = "blob";
oReq.onload = function(e) {
    var blob = new Blob([oReq.response], { type : 'text\/csv' });
    account.data = blob;
}
oReq.onerror = function(e){
    ...
}
oReq.send();

К счастью, я уже использовал Blob для отправки данных обратно на сервер, поэтому я фактически сохраняю здесь этап декодирования / кодирования...

Если вы установите правильную кодировку в запросе, не будет ли jQuery использовать ту же кодировку для ответа?

Так что-то вроде:

$.ajax({
    type: "GET",
    url: "test.php",
    contentType: "application/x-www-form-urlencoded;charset=windows-1252",
    dataType: 'json',
    success: function(data) {
            console.log(data);
    }
});

Я не уверен, если это возможно. В документе сказано, что вы можете указать кодировку, но браузер всегда будет делать запрос как UTF-8 (согласно спецификации):

contentType (по умолчанию: 'application/x-www-form-urlencoded; charset=UTF-8')

Тип: String При отправке данных на сервер используйте этот тип содержимого. По умолчанию используется "application/x-www-form-urlencoded; charset=UTF-8", что подходит для большинства случаев. Если вы явно передаете тип содержимого в $.ajax(), то он всегда отправляется на сервер (даже если данные не отправляются). Спецификация W3C XMLHttpRequest гласит, что кодировка всегда UTF-8; указание другой кодировки не заставит браузер изменить кодировку.

Так что код будет таким:

$.ajax({
    type: 'GET',
    url: url,
    contentType: "application/x-www-form-urlencoded; charset=windows-1252",
    dataType: 'json',
    success: function(data) {
        console.log(data);
    }
});

если это не работает, вы должны создать "прокси", который преобразует ваш файл из windows-1252 в utf-8

Возможно, кому-то будет полезно следующее.

      function getData(url) {
  var request = new XMLHttpRequest();
  request.open('GET', url, false);
  request.overrideMimeType('text/xml; charset=iso-8859-1');
  request.send(null);
  if (request.status === 200) {
    console.log(request.responseText);
  }
}
Другие вопросы по тегам