如何在blob类型中使用UTF-8?

问题描述 投票:0回答:1

我必须通过csv文件导出表。

csv文件数据来自Blob类型的服务器。

Blob {size: 2067, type: "text/csv"}
async exportDocumentsByCsv() {
    this.commonStore.setLoading(true)
    try {
      const result = await DocumentSearchActions.exportDocumentsByCsv({
        searchOption: this.documentSearchStore.searchOption
      })

      // first
      // const blob = new Blob([result.body], { type: 'text/csv;charset=utf-8;' })

      // second
      // const blob = new Blob([`\ufeff${result.body}`], { type: 'text/csv;charset=utf-8;' })
      const blob = result.body
      console.log('result.body', result.body)
      const fileName = `document - search - result.csv`
      if (window.navigator && window.navigator.msSaveOrOpenBlob) {
        // for IE
        window.navigator.msSaveOrOpenBlob(blob, fileName)
      } else {
        FileSaver.saveAs(blob, fileName)
      }
      this.commonStore.setLoading(false)
    } catch (err) {
      alert(err.errorMessage)
      this.commonStore.setLoading(false)
    }
  }

我必须设置utf-8或者因为我的语言。

我试图解决这个问题,但我不知道如何解决它。

我搜索通过使用\ufeff解决了这个问题但是当我尝试使用第二种方式时,它对我不起作用。

| [object  | Blob]  |
javascript blob
1个回答
1
投票

Blob不会为您处理编码,它只看到二进制数据。它唯一的转换是你在构造函数的BlobsList中传入一个UTF-16 DOMString

在您的情况下,最好的方法是在服务器中将所有内容从服务器设置为UTF-8,并确保使用UTF-8发送所有内容。这样,您就可以直接保存服务器的响应,它将采用UTF-8格式。

现在,如果要将文本文件从已知编码转换为UTF-8,可以使用TextDecoder,它可以将给定编码的二进制数据的ArrayBuffer视图解码为DOMString,然后可以使用它生成UTF-8 Blob:

/* const data = await fetch(url)
  .then(resp=>resp.arrayBuffer())
  .then(buf => new Uint8Array(buf));
*/
const data = new Uint8Array([147, 111, 152, 94 ]);
// the original data, with Shift_JIS encoding
const shift_JISBlob = new Blob([data]);
saveAs(shift_JISBlob, "shift_JIS.txt");

// now reencode as UTF-8
const encoding = 'shift_JIS';
const domString = new TextDecoder(encoding).decode(data);

console.log(domString); // here it's in UTF-16


// UTF-16 DOMStrings are converted to UTF-8 in Blob constructor
const utf8Blob = new Blob([domString]);
saveAs(utf8Blob, 'utf8.txt');


function saveAs(blob, name) {
  const a = document.createElement('a');
  a.href = URL.createObjectURL(blob);
  a.download = name;
  a.textContent = 'download ' + name;
  document.body.append(a);
}
a{display: block;}
© www.soinside.com 2019 - 2024. All rights reserved.