40

真的可以更改 Blob 字符集吗?我尝试了几个小时,但它不起作用。看到这个

jQuery("#download").click(function() {
    var csv_content = jQuery("#csv").val(),
        download = document.createElement("a"),
        blob = new Blob([csv_content], { type: "text/csv;charset=ISO-8859-1" });

    download.href = window.URL.createObjectURL(blob);
    download.download = "test.csv";

    var event = document.createEvent("MouseEvents");
    event.initMouseEvent(
        "click", true, false, window, 0, 0, 0, 0, 0
        , false, false, false, false, 0, null
    );
    download.dispatchEvent(event);    
});

我需要导出 CSV 以在 Excel 上打开,但它始终以 UTF-8 保存,Excel 无法处理。

4

4 回答 4

157

我在发布之前找到了解决方案。

实际上,charset 的更改并没有解决。但是,我为下载过程发送了 UTF-8 标头,Excel 能够正确理解文件格式。感谢 Erik Töyrä 的回应

blob = new Blob(["\ufeff", csv_content]);
于 2013-09-20T20:20:57.070 回答
9

在我的例子中,我使用 Angular JS 从服务器接收编码的 CSV 文件以响应 HTTP POST。问题是从 XMLHttpRequests 返回的 CSV 表示为 Unicode(我想说 UTF-8,但据此是 UTF-16)字符串,而不是预编码的二进制数据。在您的示例中看起来也是如此,它正在从 DOM 元素中读取 CSV?在这种情况下,它最终在内存中被表示为 Unicode,因此无论您将编码元数据设置为什么值,数据仍然是 Unicode。

我的 Angular 代码正在做这样的事情:

$http.post('/url', postData, {}).then(handleResponse);

在内部handleResponse,数据已经以 Unicode 表示。根据 Angular 的$http服务,不提供responseType配置对象的属性会导致它默认为string. 根据 Mozilla的说法,它最终表示为 UTF-16 中的DOMString,而我们实际上希望它是Blob。将 config 对象设置为responseType成功blob地阻止了内容被解码。如果没有这个,响应数据在被放入 Blob 之前会被无意中解码。

$http.post('/url', postData, {responseType: 'blob'}).then(handleResponse);

然后我使用saveAs()让浏览器向用户提供文件内容。

function handleResponse(response) {
    let headers = response.headers();
    let blob = new Blob([response.data], {type: headers['content-type']});
    saveAs(blob, headers['x-filename']);
}

我得到了responseTypehttps://stackoverflow.com/a/16791296/1225617设置的想法

于 2016-04-26T11:44:13.223 回答
1
  const blob = new Blob([csvData], { type: 'text/csv;charset=utf-8;' });
    if (navigator.msSaveBlob) { // IE 10+
      navigator.msSaveBlob(blob, filename);
    } else {
      const link = document.createElement('a');
      if (link.download !== undefined) {
        // Browsers that support HTML5 download attribute
        const url = URL.createObjectURL(blob);
        link.setAttribute('href', url);
        link.setAttribute('download', filename);
        link.style.visibility = 'hidden';
        document.body.appendChild(link);
        link.click();
        document.body.removeChild(link);
      }
    }

这适用于vuejs中 excel 格式的 csv 导出。

于 2020-05-21T07:08:49.903 回答
0

如果您在 csv 中有一些符号并且接受的解决方案不能解决问题:

blob = new Blob(["\ufeff", csv_content]);
// for csv_content you can try like below.
function b64DecodeUnicode(str: any) {        
        return decodeURIComponent(atob(str).split('').map((c: any) => {
            return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
        }).join(''));
    }
于 2018-08-08T09:43:35.540 回答