Ответ 1
Вы должны добавить спецификацию UTF-8 в начале текста, например:
var csvContent = "data:text/csv;charset=utf-8,%EF%BB%BF";
Он работал у меня с Excel 2013.
Мне нужно экспортировать массив javascript в файл excel и загрузить его. Я делаю это в этом коде. data - массив объектов javascript.
var csvContent = "data:text/csv;charset=utf-8,";
data.forEach(function(dataMember, index)
{
dataString = dataMember.join(",");
csvContent += index < data.length ? dataString+ "\n" : dataString;
});
var encodedUri = encodeURI(csvContent);
var link = document.createElement("a");
link.setAttribute("href", encodedUri);
link.setAttribute("download", "upload_data" + (new Date()).getTime() + ".csv");
link.click();
Все это работает отлично, пока у меня нет строковых свойств, у которых есть неанглийские символы, такие как испанский, арабский или иврит. Как я могу сделать экспорт со всеми этими значениями, отличными от ASCII?
Вы должны добавить спецификацию UTF-8 в начале текста, например:
var csvContent = "data:text/csv;charset=utf-8,%EF%BB%BF";
Он работал у меня с Excel 2013.
Вы можете сначала добавить спецификацию, использовать этот код и попробовать
var BOM = "\uFEFF";
var csvContent = BOM + csvContent;
а затем введите заголовки файлов с данными: "text/csv; charset = utf-8"
Excel действительно плохо обнаруживает кодировку, особенно Excel на OSX.
Лучшим решением будет кодирование вашего CSV в кодировке Excel по умолчанию: windows-1252 (также называемый ANSI, который в основном является подмножеством ISO-8859-1).
Я приведу полный пример того, как это сделать: https://github.com/b4stien/js-csv-encoding.
2 основных части stringencoding (для кодирования содержимого вашего CSV в Windows-1252) и FileSaver.js (для загрузки сгенерированного Blob).
Похоже:
var csvContent = 'éà; ça; 12\nà@€; çï; 13',
textEncoder = new TextEncoder('windows-1252');
var csvContentEncoded = textEncoder.encode([csvContent]);
var blob = new Blob([csvContentEncoded], {type: 'text/csv;charset=windows-1252;'});
saveAs(blob, 'some-data.csv');
Вариант 1
используйте библиотеку iconv-lite
и закодируйте свой вывод на ascii перед отправкой обратно пользователю.
Пример:
var iconv = require('iconv-lite');
buf = iconv.encode(str, 'win1255'); // return buffer with windows-1255 encoding
Вариант 2
Запишите в заголовке файла заголовок спецификации кодировки UTF-8. Пример:
res.header('Content-type', 'text/csv; charset=utf-8');
res.header('Content-disposition', 'attachment; filename=excel.csv');
res.write(new Buffer('EFBBBF', 'hex')); // BOM header
// rest of your code
Вариант 3
Используйте формат url base64, например data:text/csv;base64,77u/Zm9vLGJhcg0KYWFhLGJiYg==
. Этот метод будет работать и на стороне клиента (IE10 +, FF, Chrome, Opera, Safari).
Например:
window.location = "data:text/csv;base64,77u/" + btoa("foo,bar\r\naaa,bbb");
каким-то образом найден Tab-Separated-CSV с кодировкой utf-16le с BOM работает в WIN/MAC Excel
после ответа b4stien, но немного измените архив:
var csvContent = 'éà; ça; 12\nà@€; çï; 13',
textEncoder = new TextEncoder('utf-16le');
var csvContentEncoded = textEncoder.encode([csvContent]);
var bom = new Uint8Array([0xFF, 0xFE]);
var out = new Uint8Array( bom.byteLength + csvContentEncoded.byteLength );
out.set( bom , 0 );
out.set( csvContentEncoded, bom.byteLength );
var blob = new Blob([out]);
saveAs(blob, 'some-data.csv');
с помощью тестов Linux/usr/bin/file:
Little-endian UTF-16 Unicode text, with very long lines, with CRLF line terminators
B4stien, спасибо вам за ваш ответ! После тестирования нескольких решений на основе кодировки "utf8" кодирование окон-1252 является единственным решением, которое позволило мне сохранить мой акцент в Excel 365!
Manetsus, ответ b4stien и его ссылка были очень полезны для моего случая: мне нужно экспортировать французские и немецкие данные в файл csv: ни одно решение на основе "utf8" не работало... Только его решение, использующее "ANSI" (window-1252)...
Я даю его образец кода, и вы можете загрузить зависимые кодировки-indexes.js, encoding.js и FileSaver.js из ссылки...
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<script type="text/javascript" src="encoding-indexes.js"></script>
<script type="text/javascript" src="encoding.js"></script>
<script type="text/javascript" src="FileSaver.js"></script>
</head>
<body>
<a href="#" id="download-csv">Click me to download a valid CSV !</a>
<script type="text/javascript">
var csvContent = 'éà; ça; 12\nà@€; çï; 13',
textEncoder = new CustomTextEncoder('windows-1252', {NONSTANDARD_allowLegacyEncoding: true}),
fileName = 'some-data.csv';
var a = document.getElementById('download-csv');
a.addEventListener('click', function(e) {
var csvContentEncoded = textEncoder.encode([csvContent]);
var blob = new Blob([csvContentEncoded], {type: 'text/csv;charset=windows-1252;'});
saveAs(blob, fileName);
e.preventDefault();
});
</script>
</body>
</html>
Тем не менее, поскольку Excel относительно открыт для поддержки языков и форматов, я не исключаю, что UTF8 не поддерживается в моей среде разработки из-за того, как он установлен...
Примечание. Я тестирую его с помощью Firefox, Chrome и IE 11 на Windows 7, с Excel 365...