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

В разширение на браузъра, което разработвам, правя XHR заявка за зареждане на някои данни, използвайки jQuery:

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

Дистанционно заредените данни са Windows-1252 кодиран CSV файл, сервиран с 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_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, за да публикувам данните обратно на сървъра, така че всъщност запазвам стъпка за декодиране/кодиране тук...

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')

Тип: низ Когато изпращате данни към сървъра, използвайте този тип съдържание. По подразбиране е "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