使用XMLHttpRequest获取非utf8数据

时间:2017-10-15 08:33:51

标签: javascript utf-8 xmlhttprequest

我想使用xmlHttpRequest从网上获取文档。然而,有问题的文字并不是utf8(在这种情况下它是windows-1251,但在一般情况下,我肯定不知道)。

但是,如果我使用responseType="text",它会将其视为字符串为utf8,忽略内容类型中的字符集(导致令人讨厌的混乱)。

如果我使用' blob' (可能是我想要的最接近的东西),我可以将其转换为考虑到编码的DomString吗?

2 个答案:

答案 0 :(得分:6)

我实际上找到了一个可以实现我想要的API,从这里开始:

https://developers.google.com/web/updates/2014/08/Easier-ArrayBuffer-String-conversion-with-the-Encoding-API

基本上,使用responseType="arraybuffer",从返回的标头中选择编码,然后使用DataViewTextDecoder。它完全符合要求。

const xhr = new XMLHttpRequest();
xhr.responseType = "arraybuffer";
xhr.onload = function() {
  const contenttype = xhr.getResponseHeader("content-type");
  const charset = contenttype.substring(contenttype.indexOf("charset=") + 8);
  const dataView = new DataView(xhr.response);
  const decoder = new TextDecoder(charset);
  console.log(decoder.decode(dataView));
}
xhr.open("GET", "https://people.w3.org/mike/tests/windows-1251/test.txt");
xhr.send(null);

fetch("https://people.w3.org/mike/tests/windows-1251/test.txt")
  .then(response => {
    const contenttype = response.headers.get("content-type");
    const charset = contenttype.substring(contenttype.indexOf("charset=") + 8);
    response.arrayBuffer()
      .then(ab => {
        const dataView = new DataView(ab);
        const decoder = new TextDecoder(charset);
        console.log(decoder.decode(dataView));
      })
  })

答案 1 :(得分:3)

  

如果我使用'blob'(可能是我想要的最接近的东西),我可以考虑编码将其转换为DomString吗?

https://medium.com/programmers-developers/convert-blob-to-string-in-javascript-944c15ad7d52概述了您可以使用的一般方法。要将其应用于获取远程文档的情况:

像这样:

const reader = new FileReader()
reader.addEventListener("loadend", function() {
  console.log(reader.result)
})
fetch("https://people.w3.org/mike/tests/windows-1251/test.txt")
  .then(response => response.blob())
  .then(blob => reader.readAsText(blob, "windows-1251"))

或者如果您真的想要使用XHR:

const reader = new FileReader()
reader.addEventListener("loadend", function() {
  console.log(reader.result)
})
const xhr = new XMLHttpRequest()
xhr.responseType = "blob"
xhr.onload = function() {
  reader.readAsText(xhr.response, "windows-1251")
}
xhr.open("GET", "https://people.w3.org/mike/tests/windows-1251/test.txt", true)
xhr.send(null)

  

但是,如果我使用responseType="text",它会将其视为字符串为utf8,忽略内容类型中的字符集

是。这就是required by the Fetch spec(这也是XHR规范所依赖的):

  

实现Body mixin的对象也有一个关联的包数据算法,给定 bytes type mimeType ,打开类型,并运行相关步骤:
  ......   ↪文字
  返回在 bytes 上运行UTF-8 decode的结果。