Экспорт файла CSV с кодировкой UTF-8 - PullRequest
0 голосов
/ 11 сентября 2018

Это то, что я использую для экспорта таблицы 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 голосов
/ 12 сентября 2018

Хорошо, я смог найти ответ на свою проблему. Я написал другую функцию, которая декодирует символьные объекты 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';

Вот и все. Я надеюсь, что это поможет кому-то еще с подобной проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...