convert bom java character-encoding oracle10g byte-order-mark

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.