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

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

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

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

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


person Laurent VB    schedule 26.08.2013    source источник


Ответы (3)


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

person Laurent VB    schedule 27.08.2013

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

Итак, что-то вроде:

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

Я не уверен, возможно ли это. В doc сказано, что вы можете указать кодировку, но браузер всегда будет выполнять запрос в формате 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

person patrick    schedule 26.08.2013
comment
Спасибо, Патрик. К сожалению, как вы и предполагали, это не сработает. Идея прокси-сервера как таковая невозможна, потому что запрос должен быть сделан с учетными данными пользователя. - person Laurent VB; 26.08.2013