使用javascript导出CSV时,重音字母未正确显示

Accented letters not showing properly when exporting CSV using javascript

本文关键字:显示 导出 javascript CSV 使用      更新时间:2023-09-26

我正在我的网站上导出为CSV功能。数据是西班牙语的,所以里面会有很多重音字符,这个问题的一个例子是标题"Año"(年),但在 excel 上它显示为"Año"。

这是我使用 javascript 的导出代码:

.HTML

<a href="#" class="btn" id="export-btn"> Export</a>
<a href="#" class="btn" id="download" style="display:none"> Download Now </a>

.JS

$(document).on('click', '#export-btn', function(e) {
    var _this = $(this);
    _this.attr('disabled',true);
    var datenow = new Date();
        datenow = datenow.getTime();
    var exportdata = ConvertToCSV(exportdata);
    $('#download').attr("href", "data:text/csv;charset=utf8," + encodeURIComponent(exportdata) );
    $('#download').attr("download", "InTrack-Report-"+datenow+".csv");
    $('#download').show(); //show download button
    _this.attr('disabled',false);
});

这是 转换到 CSV 函数,我添加了sep=;以使 excel 将分号识别为分隔符。

function ConvertToCSV(objArray) {
    var array = typeof objArray != 'object' ? JSON.parse(objArray) : objArray;
    var str = 'sep=;'r'n'; //tell excel that we used semicolon as separator
    //header
    var line = '';
    for (var i = 0; i < array.Fields.length; i++) {
        if (line != '') line += ';'
        line += array.Fields[i]['Title'];
    }
    str += line + ''r'n';
    //rows
    for (var i = 0; i < array.Rows.length; i++) {
        var line = '';
        for (var index in array.Rows[i]) {
            if (line != '') line += ';'
            line += array.Rows[i][index];
        }
        str += line + ''r'n';
    }
    return str;
}


更新:我找到了一种按照此处的解决方案正确显示重音字母的方法。但是我不得不删除sep=;这很重要,因为它用分号分隔我的数据。有没有办法在顶部同时添加 BOM 和sep=;?如果是这样,如何?因为似乎我只能使用一个。

所以
现在不是str='sep=;'r'n'而是str=''uFEFF sep=;'r'n'

如果在创建 file.csv 时遇到 ASCII 错误,请尝试先添加 BOM。

var BOM = "'uFEFF"; 
return BOM + str;

然后用数据将文件头装箱:"text/csv;charset=utf-8"而不是 UTF8(不带 - )

在 encodeURI 的位置使用 escape 并在字符串前添加 "sep=;'" 并允许它进行转义

示例代码

var csvString =  "sep=;'n" + csvRows.join("'n");
var a         = document.createElement('a');
a.href        = 'data:attachment/csv;charset=UTF-8,%EF%BB%BF' + escape(csvString);