Javascript vers le problème d'encodage d'exportation csv

J'ai besoin d'exporter javascript array pour exceller le fichier et le télécharger Je le fais dans ce code. Les données sont un ensemble d'objets 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(); 

Tout cela fonctionne bien jusqu'à ce que j'ai des propriétés de chaîne qui ont des caractères non anglais, comme l'espagnol, l'arabe ou l'hébreu. Comment puis-je exporter avec toutes ces valeurs non ASCII?

    Vous devez ajouter la nomenclature UTF-8 au début du texte, comme:

     var csvContent = "data:text/csv;charset=utf-8,%EF%BB%BF"; 

    Cela m'a fonctionné avec Excel 2013.

    Demo Fiddle

    Vous pouvez ajouter la nomenclature au début, utiliser ce code et essayer

     var BOM = "\uFEFF"; var csvContent = BOM + csvContent; 

    Puis calculez les en-têtes de fichiers avec les données: "text / csv; charset = utf-8"

    Excel est vraiment mauvais pour détecter le codage, en particulier Excel sur OSX.

    La meilleure solution serait d'encoder votre CSV dans le codage Excel par défaut: windows-1252 (également appelé ANSI, qui est essentiellement un sous-ensemble de l'ISO-8859-1).

    J'ai mis un exemple complet de la façon suivante: https://github.com/b4stien/js-csv-encoding .

    Les 2 parties principales sont l'encodage des chaînes (pour coder le contenu de votre CSV dans Windows-1252) et FileSaver.js (pour télécharger le Blob généré).

    Ça ressemble à:

     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'); 

    Option 1

    Utilisez la bibliothèque iconv-lite et encodez votre sortie sur ascii avant de l'envoyer à l'utilisateur. Exemple:

     var iconv = require('iconv-lite'); buf = iconv.encode(str, 'win1255'); // return buffer with windows-1255 encoding 

    Option 2

    Écrivez sur la tête du fichier l'en-tête BOM de l'encodage UTF-8. Exemple:

     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 

    Option 3

    Utilisez le format url base64 comme les data:text/csv;base64,77u/Zm9vLGJhcg0KYWFhLGJiYg== . Cette méthode fonctionnera également sur le client (IE10 +, FF, Chrome, Opera, Safari).

    Par exemple:

     window.location = "data:text/csv;base64,77u/" + btoa("foo,bar\r\naaa,bbb"); 

    En quelque sorte trouvé Tab-Separated-CSV avec codage utf-16le avec BOM fonctionne sur WIN / MAC Excel

    Suivi la réponse de b4stien mais fait une petite différence pour l'archivage:

     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'); 

    Avec les tests Linux / usr / bin / file:

     Little-endian UTF-16 Unicode text, with very long lines, with CRLF line terminators 

    B4stien, merci pour votre réponse! Après avoir testé plusieurs solutions basées sur charset "utf8", l'encodage de Windows-1252 est la seule solution qui m'a permis de garder mon accent dans Excel 365!

    Manetsus, la réponse de b4stien et son lien étaient très utiles pour mon cas: je dois exporter des données françaises et allemandes dans un fichier csv: aucune solution basée sur "utf8" n'a fonctionné … Seule sa solution qui utilise un "ANSI" (fenêtre -1252) encodeur …

    Je donne son exemple de code, et vous pouvez télécharger l'encodage-indexes.js, encoding.js et FileSaver.js à partir du lien …

      <!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> 

    Néanmoins, comme Excel est relativement ouvert dans le support des langues et des formats, je n'exclus pas que UTF8 n'est pas pris en charge dans mon environnement de développement en raison de sa connexion …

    Remarque: je le teste avec Firefox, Chrome et IE 11 sur Windows 7, avec Excel 365 …