web-dev-qa-db-fra.com

définition d'un UTF-8 dans Java et fichier csv

J'utilise ce code pour ajouter des mots persans à un fichier csv via OpenCSV :

String[] entries="\u0645 \u062E\u062F\u0627".split("#");
try{
    CSVWriter writer=new CSVWriter(new OutputStreamWriter(new FileOutputStream("C:\\test.csv"), "UTF-8"));

    writer.writeNext(entries);
    writer.close();
}
catch(IOException ioe){
    ioe.printStackTrace();
}

Lorsque j'ouvre le fichier csv résultant, dans Excel, il contient "ứỶờịỆ" . D'autres programmes tels que notepad.exe n'ont pas ce problème, mais tous mes utilisateurs utilisent MS Excel.

Le remplacement d'OpenCSV par SuperCSV ne résout pas ce problème.

Lorsque j'ai tapé manuellement des caractères persans dans un fichier csv, je n'ai aucun problème.

32
mehdi

Malheureusement, CSV est un format très ad hoc sans métadonnées et sans véritable standard qui exigerait un encodage flexible. Tant que vous utilisez CSV, vous ne pouvez pas utiliser de manière fiable des caractères en dehors de ASCII.

Vos alternatives:

  • Écrivez en XML (qui a des métadonnées d'encodage si vous le faites correctement) et demandez aux utilisateurs importez le XML dans Excel.
  • Utilisez POI Apache pour créer des documents Excel réels.
8
Michael Borgwardt

J'ai passé un peu de temps mais j'ai trouvé une solution à votre problème.

J'ai d'abord ouvert le bloc-notes et écrit la ligne suivante: שלום, hello, привет Ensuite, je l'ai enregistré en tant que fichier he-en-ru.csv en utilisant UTF-8. Ensuite, je l'ai ouvert avec MS Excel et tout a bien fonctionné.

Maintenant, j'ai écrit un simple programme Java qui imprime cette ligne dans un fichier comme suit:

    PrintWriter w = new PrintWriter(new OutputStreamWriter(os, "UTF-8"));
    w.print(line);
    w.flush();
    w.close();

Lorsque j'ai ouvert ce fichier à l'aide d'Excel, j'ai vu "gibrish".

Ensuite, j'ai essayé de lire le contenu de 2 fichiers et (comme prévu), j'ai vu que le fichier généré par le bloc-notes contient un préfixe de 3 octets:

    239 EF
    187 BB
    191 BF

J'ai donc modifié mon code pour imprimer ce préfixe en premier et le texte après cela:

    String line = "שלום, hello, привет";
    OutputStream os = new FileOutputStream("c:/temp/j.csv");
    os.write(239);
    os.write(187);
    os.write(191);

    PrintWriter w = new PrintWriter(new OutputStreamWriter(os, "UTF-8"));

    w.print(line);
    w.flush();
    w.close();

Et ça a marché! J'ai ouvert le fichier à l'aide d'Excel et vu le texte comme je m'y attendais.

Conclusion: écrivez ces 3 octets avant d'écrire le contenu. Ce préfixe indique que le contenu est en 'UTF-8 avec BOM ' (sinon c'est juste 'UTF-8 sans BOM').

104
AlexR

Excel n'utilise pas UTF8 pour ouvrir les fichiers CSV. C'est un problème connu. L'encodage réel utilisé dépend des paramètres régionaux de Microsoft Windows. Avec un lcoale allemand par exemple, Excel ouvrirait un fichier CSV avec CP1252.

Vous pouvez créer un fichier Excel contenant des caractères persans et l'enregistrer en tant que fichier CSV. Ensuite, écrivez un petit programme Java pour lire ce fichier et tester certains encodages courants. C'est la façon dont j'ai l'habitude de comprendre l'encodage correct pour les trémas allemands dans les fichiers CSV.

4
chkal