2013-08-26 3 views
1

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

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

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

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

ответ

1

Как намекнули мои предыдущие исследования и первые ответы, я не мог найти способ делать то, что хотел, используя jQuery. я работал вокруг вопроса с использованием ванили XMLHttpRequest с responseType = сгустка, как объяснено в 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, чтобы получить возможность отправлять данные обратно на сервер, так что я на самом деле экономить шаг декодирования/кодирования здесь ...

0

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

Так что-то вдоль линий:

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

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

CONTENTTYPE (по умолчанию: «применение/х-WWW-форм-urlencoded; кодировок = 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

+0

Thanks Patrick. К сожалению, как вы и предполагали, это не работает. Прокси-идея невозможна как таковая, поскольку запрос должен быть выполнен с учетными данными пользователя. –