使用UTF-8编码导出CSV文件

时间:2018-09-11 13:46:48

标签: javascript csv encoding export

这是我用来将HTML表导出到csv并下载的方法:

exportCSVFile: function (object) {
    var processRow = function (row) {
        var finalVal = '';
        for (var j = 0; j < row.length; j++) {
            var result = row[j];
            if (j > 0) {
                finalVal += ';';
            }
            finalVal += result;
        }
        return finalVal + '\n';
    };

    const {filename, table} = object;
    var csvFile = '';
    for (var i = 0; i < table.length; i++) {
        csvFile += processRow(table[i]);
    }

    csvFile = new Blob([csvFile], {type: 'text/csv;charset=utf-8'});
    var downloadCSV;
    downloadCSV = document.createElement('a');
    downloadCSV.download = filename;
    downloadCSV.href = window.URL.createObjectURL(csvFile);
    downloadCSV.style.display = 'none';
    document.body.appendChild(downloadCSV);
    downloadCSV.click();
    document.body.removeChild(downloadCSV);
},

导出英语文档时,它工作得很好,但是当我尝试导出带有特殊字符(例如,é,è,ç,...)的法语文档时,会出现&eacute,&egrave ...

从SO来看,我发现有些人可以通过添加前缀`\ uFEFF来解决此问题,但不幸的是,这对我不起作用。

有人知道为什么会这样吗?

1 个答案:

答案 0 :(得分:0)

好的,因此我能够找到问题的答案。我所做的是,我写了另一个函数,通过用其键替换HTML代码来解码HTML字符实体。

例如:

Pr&eacute;paration变为préparation。 这是有问题的函数:

decode: function(string) {
    var map = {
        '"': '&quot;',
        'à' : '&agrave;',
        'á' : '&aacute;',
        'â' : '&acirc;',
        'ã' : '&atilde;',
        'ä' : '&auml;',
        'å' : '&aring;',
        'æ' : '&aelig;',
        'ç' : '&ccedil;',
        'è' : '&egrave;',
        'é' : '&eacute;',
        'ê' : '&ecirc;',
        'ë' : '&euml;',
        'ì' : '&igrave;',
        'í' : '&iacute;',
        'î' : '&icirc;',
        'ï' : '&iuml;',
        'À' : '&Agrave;',
        'Á' : '&Aacute;',
        'Â' : '&Acirc;',
        'Ã' : '&Atilde;',
        'Ä' : '&Auml;',
        'Å' : '&Aring;',
        'Æ' : '&AElig;',
        'Ç' : '&Ccedil;',
        'È' : '&Egrave;',
        'É' : '&Eacute;',
        'Ê' : '&Ecirc;',
        'Ë' : '&Euml;',
        'Ì' : '&Igrave;',
        'Í' : '&Iacute;',
        'Î' : '&Icirc;',
        'Ï' : '&Iuml;',
        '\'' : '&apos;'

    };
    var entityMap = map;
    for (var key in entityMap) {
        var entity = entityMap[key];
        var regex = new RegExp(entity, 'g');
        string = string.replace(regex, key);
    }
    return string;
}

然后我刚刚在返回最终值之前在OP代码中对其进行了调用:

finalVal = DecodeUtils.decode(finalVal);            
return finalVal + '\n';

就是这样。希望对其他有类似问题的人有所帮助。