使用指定的charset下载BLOB内容

Dav*_*ues 28 javascript blob character-encoding

真的可以改变Blob charset吗?我正在尝试几个小时,但它不起作用.看到这个.

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);    
});
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*ues 111

我发现之前发现了解决方案.

事实上,charset的变化尚未得到解决.但是,我发送了UTF-8标头用于下载过程,Excel能够正确理解文件格式.感谢ErikTöyrä的回应.

blob = new Blob(["\ufeff", csv_content]);
Run Code Online (Sandbox Code Playgroud)

  • 在开头添加"\ ufeff"确实让它成功了! (8认同)
  • 我怀疑这对你有用,因为ISO-8859-1是UTF-8的一个子集,所以虽然浏览器返回UTF-8,但你添加的前缀允许Excel找出要做的事情.但是,在我的情况下,内容是Shift-JIS,它与UTF-8不兼容,因此返回以UTF-8重新编码的内容不是一种选择. (3认同)

Ada*_*hip 9

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

我的Angular代码做了这样的事情:

$http.post('/url', postData, {}).then(handleResponse);
Run Code Online (Sandbox Code Playgroud)

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

$http.post('/url', postData, {responseType: 'blob'}).then(handleResponse);
Run Code Online (Sandbox Code Playgroud)

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

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

我有想法responseType/sf/answers/1175390751/设置