impostazione di un UTF-8 nei file java e csv

Sto usando questo codice per aggiungere parole persiane a un file csv tramite 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(); } 

Quando apro il file csv risultante, in Excel, contiene “ứỶờịỆ” . Altri programmi come notepad.exe non hanno questo problema, ma tutti i miei utenti utilizzano MS Excel.

Sostituire OpenCSV con SuperCSV non risolve questo problema.

Quando ho digitato manualmente i caratteri persiani in file CSV, non ho alcun problema.

Sfortunatamente, CSV è un formato molto ad hoc senza metadati e nessun vero standard che imponga una codifica flessibile. Finché utilizzi CSV, non puoi utilizzare in modo affidabile caratteri esterni a ASCII.

Le tue alternative:

  • Scrivi in ​​XML (che ha i metadati di codifica se lo fai correttamente) e chiedi agli utenti di importare l’XML in Excel.
  • Utilizzare POI Apache per creare documenti Excel reali.

Ho passato un po ‘di tempo ma ho trovato una soluzione per il tuo problema.

Per prima cosa ho aperto il blocco note e ho scritto la seguente riga: שלום, ciao, привет Quindi l’ho salvato come file he-en-ru.csv usando UTF-8. Poi l’ho aperto con MS Excel e tutto ha funzionato bene.

Ora, ho scritto un semplice programma java che stampa questa riga su file come segue:

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

Quando ho aperto questo file usando excel ho visto “gibrish”.

Poi ho provato a leggere il contenuto di 2 file e (come previsto) visto che il file generato dal blocco note contiene il prefisso di 3 byte:

  239 EF 187 BB 191 BF 

Così, ho modificato il mio codice per stampare prima questo prefisso e il testo dopo:

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

E ha funzionato! Ho aperto il file usando excel e visto il testo come mi aspettavo.

In conclusione: scrivi questi 3 byte prima di scrivere il contenuto. Questo prefisso indica che il contenuto è in ‘UTF-8 con BOM ‘ (altrimenti è solo ‘UTF-8 senza BOM’).

Excel non usa UTF8 per aprire i file CSV. Questo è un problema noto. La codifica effettiva utilizzata dipende dalle impostazioni internazionali di Microsoft Windows. Ad esempio, con un lcoale tedesco Excel aprirà un file CSV con CP1252 .

È ansible creare un file Excel contenente alcuni caratteri persiani e salvarlo come file CSV. Quindi scrivi un piccolo programma Java per leggere questo file e testare alcune codifiche comuni. Questo è il modo in cui ho utilizzato la codifica corretta per le dieresi tedesche nei file CSV.