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

问题描述 投票:0回答:1

这是我用来将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来解决这个问题,但不幸的是,这对我不起作用。

有谁知道为什么会这样?

javascript csv encoding export
1个回答
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';

而已。我希望它能帮助其他有类似问题的人。

© www.soinside.com 2019 - 2024. All rights reserved.