web-dev-qa-db-fra.com

Exportation Javascript encodage CSV problème utf-8

J'ai besoin d'exporter le tableau javascript vers un fichier CSV et de le télécharger. Je l'ai fait mais 'ı, ü, ö, ğ, ş' ce caractère ressemble à 'Ä ± ü ö ÄŸ ÅŸ' dans le fichier CSV. J'ai essayé de nombreuses solutions recommandées sur ce site mais cela n'a pas fonctionné pour moi.

J'ai ajouté mon extrait de code. Quelqu'un peut-il résoudre ce problème?

var csvString = 'ı,ü,ö,ğ,ş';

var a = window.document.createElement('a');
a.setAttribute('href', 'data:text/csv; charset=utf-8,' + encodeURIComponent(csvString));
a.setAttribute('download', 'example.csv');
a.click();
16
Can Bozdemir

Cela dépend du programme qui ouvre le example.csv fichier. À l'aide d'un éditeur de texte, l'encodage sera UTF-8 et les caractères ne seront pas malformés. Mais en utilisant Excel l'encodage par défaut pour CSV est ANSI et non UTF-8. Donc sans forcer Excel en utilisant non pas ANSI mais UTF-8 comme encodage, les caractères seront malformés.

Excel peut être forcé en utilisant UTF-8 pour CSV avec mise d'un BOM ( Byte Order Mark ) comme premiers caractères du fichier. BOM par défaut pour UTF-8 est la séquence d'octets 0xEF,0xBB,0xBF. On pourrait donc penser simplement à mettre "\xEF\xBB\xBF" comme premier octet de la chaîne sera la solution. Mais ce serait sûrement trop simple, non? ;-) Le problème avec ceci est de savoir comment forcer JavaScript à ne pas prendre ces octets comme caractères. La "solution" utilise une "nomenclature universelle" "\uFEFF" comme mentionné dans Caractères spéciaux (JavaScript) .

Exemple:

var csvString = 'ı,ü,ü,ğ,ş,#Hashtag,ä,ö';
var universalBOM = "\uFEFF";
var a = window.document.createElement('a');
a.setAttribute('href', 'data:text/csv; charset=utf-8,' + encodeURIComponent(universalBOM+csvString));
a.setAttribute('download', 'example.csv');
window.document.body.appendChild(a);
a.click();

Voir aussi Ajout d'une nomenclature UTF-8 à une chaîne/Blob .

En utilisant cela, l'encodage sera correct. Mais néanmoins, cela ne fonctionne correctement que si la virgule est le séparateur de liste par défaut dans vos paramètres régionaux Windows. Sinon, si par exemple le point-virgule est le séparateur de liste par défaut dans vos paramètres régionaux Windows, alors tout le contenu sera dans la première colonne sans le diviser par une virgule. Ensuite, vous devez également utiliser le point-virgule comme délimiteur dans le CSV. Mais ceci est un autre problème et conduit à la conclusion pas en utilisant CSV du tout mais en utilisant des bibliothèques qui peuvent créer directement Excel des dossiers (*.xls ou *.xlsx).

41
Axel Richter