Принудительное кодирование, используемое в запросе 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);
}
}