Les fichiers CSV exportés présentent des caractères illisibles

Lors de l’exportation de la liste des utilisateurs au format CSV, si le nom contient des caractères autres que des caractères ASCII et des chiffres, cela entraîne des caractères illisibles :

J’ai trouvé deux solutions pour résoudre ce problème :

  1. Créez un nouveau fichier XLSX dans Excel, importez les données à l’aide de l’option « À partir du texte/CSV » et ajustez l’origine du fichier sur Unicode (UTF-8).


    image

  2. Utilisez Notepad++ pour ouvrir le fichier CSV et changez l’encodage de UTF-8 en UTF-8-BOM.

Résultat :

Bien que ces deux solutions soient efficaces pour résoudre le symptôme, elles s’attaquent au problème sans en aborder la cause profonde.


Après des recherches plus approfondies, j’ai trouvé une solution potentielle à long terme à ce problème :

// Traitement pour générer un CSV, où 'body' représente les lignes de données et 'header' la ligne d'en-tête.
const csv = body.reduce((prev, current) => `${prev}\r\n${current}`, header);

// Excel nécessite une marque d'ordre des octets (BOM) pour indiquer que le fichier est encodé en UTF-8.
const BOM = Buffer.from('\uFEFF');

// Concaténez l'en-tête BOM avec le contenu CSV généré.
const bomCsv = Buffer.concat([BOM, Buffer.from(csv)]);

// Convertissez le tampon résultant en une chaîne de caractères et retournez-la.
return bomCsv.toString();

// Une fois la chaîne retournée téléchargée et ouverte avec Excel, le contenu chinois s'affichera correctement dans la feuille de calcul.

Essentiellement, Excel nécessite des métadonnées pour spécifier l’encodage des fichiers CSV. Microsoft a introduit l’en-tête BOM (Byte Order Mark) à cet effet. Bien que cet en-tête puisse être ignoré par d’autres logiciels de tableur, il est d’une importance capitale pour Excel. Pour garantir la compatibilité entre les logiciels, il est essentiel d’inclure l’en-tête BOM lors de la génération du CSV.

Je me demande si votre équipe prévoit d’intégrer cette solution dans la prochaine version ? Cela pourrait potentiellement élargir la prise en charge des langues et réduire la fréquence des bugs.

Merci de votre attention à ce sujet !

Référence :
https://www.zhihu.com/question/21869078/answer/350728339

1 « J'aime »