Comment ajouter une BOM UTF-8 en Java
J'ai un Java procédure stockée qui récupère un enregistrement de la table à l'aide d'objet Resultset et crée un fichier 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;
Mais le fichier csv généré ne montre pas le bon caractère allemand. La base de données Oracle a également un NLS_CHARACTERSET valeur de l'UTF8.
S'il vous plaît suggérer.
source d'informationauteur Fadd
Vous devez vous connecter pour publier un commentaire.
À écrire un MOB en UTF-8, vous devez
PrintStream.print()
pasPrintStream.write()
.Aussi, si vous voulez avoir de la NOMENCLATURE dans votre
csv
fichier, je suppose que vous avez besoin d'imprimer une NOMENCLATURE aprèsputNextEntry()
.Correctement écrit 0xEF 0xBB 0xBF pour le fichier, ce qui est de l'UTF-8 représentation de la NOMENCLATURE.
Je pense que
out.write('\ufeff');
devrait en fait êtreout.print('\ufeff');
.Selon la javadocle
write(int)
méthode réellement écrit un octet ... sans aucun encodage des caractères. Doncout.write('\ufeff');
écrit l'octet0xff
. En revanche, laprint(char)
méthode encode le caractère de l'un ou des octets à l'aide du flux d'encodage, puis écrit ces octets.Juste au cas des personnes sont à l'aide de
PrintStream
s, vous avez besoin de faire un peu différemment. Alors qu'unWriter
va faire de la magie pour convertir un seul octet 3 octets, unPrintStream
exige que tous les 3 octets de l'UTF-8 BOM individuellement:Alternativement, vous pouvez utiliser les valeurs hexadécimales pour les personnes directement:
Dans mon cas ça fonctionne avec le code: