有可能真的改变Blob charset吗?我正在尝试几个小时,但它不起作用。 See this
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无法处理它。
答案 0 :(得分:92)
我发布之前找到了解决方案。
事实上,charset的变化尚未得到解决。但是,我发送了UTF-8标头用于下载过程,Excel能够正确理解文件格式。 Thanks to this response of Erik Töyrä
blob = new Blob(["\ufeff", csv_content]);
答案 1 :(得分:7)
在我的情况下,我使用Angular JS从服务器接收编码的CSV文件以响应HTTP POST。问题是从XMLHttpRequests返回的CSV表示为Unicode(我想说UTF-8,但根据this它是UTF-16)字符串,而不是预编码的二进制数据。在您的示例中看起来也是如此,它是从DOM元素读取CSV吗?在这种情况下,它最终在内存中表示为Unicode,因此将编码元数据设置为什么值并不重要,数据仍然是Unicode。
我的Angular代码正在执行以下操作:
$http.post('/url', postData, {}).then(handleResponse);
在handleResponse
内,数据已经用Unicode表示。根据Angular的$http服务,在配置对象上不提供responseType
属性会导致它默认为string
。哪个according to Mozilla最终在UTF-16中表示为DOMString,而我们实际上希望它是Blob。在配置对象上设置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']);
}
我想从https://stackoverflow.com/a/16791296/1225617
设置responseType
答案 2 :(得分: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(''));
}
答案 3 :(得分:0)
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导出。