1

在我正在开发的浏览器扩展中,我正在使用 jQuery 执行 XHR 请求以加载一些数据:

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

远程加载的数据是一个 windows-1252 编码的 CSV 文件,带有 Content-disposition:attachment 并且没有 mime-type/charset 标头(我无法控制后端,所以我无法修复它)。

如何强制浏览器将响应解码为 windows-1252 而不是 utf-8,就像它目前所做的那样?

4

4 回答 4

2

正如我之前的研究和第一个答案所暗示的那样,我找不到使用 jQuery 做我想做的事情的方法。我通过使用带有 responseType=blob 的 vanilla XMLHttpRequest 解决了这个问题,如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 将数据发布回服务器,所以我实际上在这里保存了解码/编码步骤......

于 2013-08-27T15:10:30.670 回答
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);
    }
});
于 2013-08-26T14:45:25.557 回答
0

我不确定这是否可能。该文档说您可以指定字符集,但浏览器将始终将请求作为 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

于 2013-08-26T14:46:56.357 回答
0

也许以下内容也可能对某人有用。

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);
  }
}
于 2021-12-14T10:14:02.533 回答