java - example - outputstream to string utf 8
configuración de un UTF-8 en java y archivo csv (3)
Esta pregunta ya tiene una respuesta aquí:
- Cómo agregar una BOM UTF-8 en java 5 respuestas
Estoy usando este código para agregar palabras en persa 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 están usando MS Excel.
Reemplazar OpenCSV con SuperCSV no resuelve este problema.
Cuando escribí caracteres persas en el archivo csv manualmente, no tengo ningún problema.
Excel no usa UTF8
para abrir archivos CSV. Eso es un problema conocido. La codificación real utilizada depende de la configuración regional de Microsoft Windows. Con un lcoale alemán, por ejemplo, Excel abriría un archivo CSV con 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. Esa es la forma en que solía averiguar la codificación correcta para diéresis alemanes en archivos CSV.
Lamentablemente, CSV es un formato muy ad hoc sin metadatos ni estándares reales que impongan una codificación flexible. Siempre que use CSV, no puede usar caracteres de manera confiable fuera de ASCII.
Sus alternativas:
- Escriba en XML (que tiene metadatos de codificación si lo hace bien) y haga que los usuarios importen el XML en Excel.
- Utilice Apache POI para crear documentos reales de Excel.
Pasé un tiempo pero encontré una solución para tu problema.
Primero abrí el bloc de notas y escribí la siguiente línea: שלום, hello, привет 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 simple de Java que imprime esta línea en un 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 "gibrish".
Luego traté de leer el contenido de 2 archivos y (como se esperaba) 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 de eso:
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 solo ''UTF-8 sin BOM'').