configurar un UTF-8 en un archivo java y csv [duplicado]

Resuelto mehdi asked hace 13 años • 3 respuestas

Estoy usando este código para agregar palabras persas a un archivo csv a través de 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();
}

Cuando abro el archivo csv resultante, en Excel, contiene "ứỶờịỆ" . Otros programas como notepad.exe no tienen este problema, pero todos mis usuarios usan MS Excel.

Reemplazar OpenCSV con SuperCSV no resuelve este problema.

Cuando escribí caracteres persas en un archivo csv manualmente, no tuve ningún problema.

mehdi avatar Nov 16 '10 15:11 mehdi
Aceptado

Pasé algún tiempo pero encontré una solución a su problema.

Primero abrí el bloc de notas y escribí la siguiente línea: שלום, hola, привет Luego lo guardé como archivo he-en-ru.csv usando UTF-8. Luego lo abrí con MS Excel y todo funcionó bien.

Ahora, escribí un programa java simple que imprime esta línea en el archivo de la siguiente manera:

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

Cuando abrí este archivo usando Excel vi "tonterías".

Luego intenté leer el contenido de 2 archivos y (como era de esperar) vi que el archivo generado por el bloc de notas contiene un prefijo de 3 bytes:

    239 EF
    187 BB
    191 BF

Entonces, modifiqué mi código para imprimir este prefijo primero y el texto después:

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

¡Y funcionó! Abrí el archivo usando Excel y vi el texto como esperaba.

En pocas palabras: escriba estos 3 bytes antes de escribir el contenido. Este prefijo indica que el contenido está en 'UTF-8 con BOM ' (de lo contrario, es simplemente 'UTF-8 sin BOM').

AlexR avatar Nov 16 '2010 09:11 AlexR

Desafortunadamente, CSV es un formato muy ad hoc, sin metadatos y sin un estándar real que exija una codificación flexible. Mientras uses CSV, no podrás usar de manera confiable ningún carácter fuera de ASCII.

Tus alternativas:

  • Escriba en XML (que tiene metadatos de codificación si lo hace bien) y haga que los usuarios importen el XML a Excel.
  • Utilice Apache POI para crear documentos Excel reales.
Michael Borgwardt avatar Nov 16 '2010 09:11 Michael Borgwardt

Excel no suele UTF8abrir archivos CSV. Ese es un problema conocido. La codificación real utilizada depende de la configuración local de Microsoft Windows. Con una versión alemana, por ejemplo, Excel abriría un archivo CSV con extensión CP1252.

Puede crear un archivo de Excel que contenga algunos caracteres persas y guardarlo como un archivo CSV. Luego escriba un pequeño programa Java para leer este archivo y probar algunas codificaciones comunes. Así es como solía descubrir la codificación correcta de las diéresis alemanas en archivos CSV.

chkal avatar Nov 16 '2010 08:11 chkal