【问题标题】:Force encoding used in XHR requestXHR 请求中使用的强制编码
【发布时间】:2013-08-29 02:15:37
【问题描述】:

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

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

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

如何强制浏览器将响应解码为 windows-1252 而不是 utf-8,因为它显然是目前这样做的?

【问题讨论】:

    标签: javascript jquery utf-8 xmlhttprequest windows-1252


    【解决方案1】:

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

    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);
      }
    }
    

    【讨论】:

      【解决方案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 将数据发送回服务器,所以我实际上在这里保存了解码/编码步骤...

      【讨论】:

      • 对我来说这是一个很好的方法,但不幸的是,Chrome 不允许我用“同步”更改“异步”,所以如果 blob 不起作用,试试这个而不是 blob 的东西:oReq.overrideMimeType ('text/xml; charset=iso-8859-1');
      【解决方案3】:

      我不确定这是否可能。 doc 表示您可以指定字符集,但浏览器将始终将请求作为 UTF-8(根据规范):

      contentType (默认: 'application/x-www-form-urlencoded; charset=UTF-8')

      Type: 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

      【讨论】:

      • 谢谢帕特里克。不幸的是,正如您所料,它不起作用。代理的想法是不可能的,因为请求必须使用用户的凭据。
      【解决方案4】:

      如果你在请求上设置了正确的编码,jQuery 不会对响应使用相同的编码吗?

      所以大致如下:

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

      【讨论】:

        猜你喜欢
        • 2014-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-04
        • 2012-09-11
        • 1970-01-01
        • 2022-01-05
        • 2016-01-07
        相关资源
        最近更新 更多