convert - Cómo agregar una BOM UTF-8 en Java
utf 8 bom java (5)
Tengo un procedimiento almacenado de Java que recupera el registro de la tabla utilizando el objeto Resultset y crea un archivo csv.
BLOB retBLOB = BLOB.createTemporary(conn, true, BLOB.DURATION_SESSION);
retBLOB.open(BLOB.MODE_READWRITE);
OutputStream bOut = retBLOB.setBinaryStream(0L);
ZipOutputStream zipOut = new ZipOutputStream(bOut);
PrintStream out = new PrintStream(zipOut,false,"UTF-8");
out.write(''/ufeff'');
out.flush();
zipOut.putNextEntry(new ZipEntry("filename.csv"));
while (rs.next()){
out.print("/"" + rs.getString(i) + "/"");
out.print(",");
}
out.flush();
zipOut.closeEntry();
zipOut.close();
retBLOB.close();
return retBLOB;
Pero el archivo csv generado no muestra el carácter alemán correcto. La base de datos Oracle también tiene un valor NLS_CHARACTERSET de UTF8.
Por favor recomiende.
Creo que out.write(''/ufeff'');
debería estar out.print(''/ufeff'');
.
Según javadoc , el método write(int)
escribe un byte ... sin codificación de caracteres. Así que out.write(''/ufeff'');
escribe el byte 0xff
. Por el contrario, el método print(char)
codifica el carácter como uno o como bytes utilizando la codificación de la secuencia, y luego escribe esos bytes.
En caso de que las personas estén usando PrintStream
, debes hacerlo de forma un poco diferente. Mientras que un Writer
hará algo de magia para convertir un solo byte en 3 bytes, un PrintStream
requiere los 3 bytes de la lista de materiales UTF-8 individualmente:
// Print utf-8 BOM
PrintStream out = System.out;
out.write(''/ufeef''); // emits 0xef
out.write(''/ufebb''); // emits 0xbb
out.write(''/ufebf''); // emits 0xbf
Alternativamente, puede usar los valores hexadecimales directamente:
PrintStream out = System.out;
out.write(0xef); // emits 0xef
out.write(0xbb); // emits 0xbb
out.write(0xbf); // emits 0xbf
En mi caso, funciona con el código:
PrintWriter out = new PrintWriter(new File(filePath), "UTF-8");
out.write(csvContent);
out.flush();
out.close();
Para escribir una lista de materiales en UTF-8 necesita PrintStream.print()
, no PrintStream.write()
.
Además, si desea tener una lista de materiales en su archivo csv
, supongo que debe imprimir una lista de materiales después de putNextEntry()
.
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(...), StandardCharsets.UTF_8));
out.write(''/ufeff'');
out.write(...);
Esto escribe correctamente 0xEF 0xBB 0xBF en el archivo, que es la representación UTF-8 de la lista de materiales.