Javaストアドプロシージャがあり、Resultset
オブジェクトを使用してテーブルからレコードをフェッチし、CS Vfileを作成します。
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;
ただし、生成されたCSVファイルには正しいドイツ語の文字が表示されません。 OracleデータベースにはNLS_CHARACTERSET
UTF8の値。
提案してください。
BOMをUTF-8で書き込むには、PrintStream.print()
ではなくPrintStream.write()
が必要です。
また、csv
ファイルにBOMを含める場合は、putNextEntry()
の後にBOMを印刷する必要があると思います。
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(...), StandardCharsets.UTF_8));
out.write('\ufeff');
out.write(...);
これにより、BOMのUTF-8表現である0xEF 0xBB 0xBFがファイルに正しく書き込まれます。
念のためあるPrintStream
sを使用する場合は、少し異なる方法で行う必要があります。 Writer
は、1バイトを3バイトに変換する魔法をかけますが、PrintStream
は、UTF-8 BOMの3バイトすべてを個別に必要とします。
// Print utf-8 BOM
PrintStream out = System.out;
out.write('\ufeef'); // emits 0xef
out.write('\ufebb'); // emits 0xbb
out.write('\ufebf'); // emits 0xbf
または、それらに16進値を直接使用することもできます。
PrintStream out = System.out;
out.write(0xef); // emits 0xef
out.write(0xbb); // emits 0xbb
out.write(0xbf); // emits 0xbf
out.write('\ufeff');
は実際にはout.print('\ufeff');
である必要があると思います。
javadoc によると、write(int)
メソッドは実際にはバイトを書き込みます...文字エンコードなしで。したがって、out.write('\ufeff');
はバイト_0xff
_を書き込みます。対照的に、print(char)
メソッドは、ストリームのエンコードを使用して文字を1つまたはバイトとしてエンコードし、それらのバイトを書き込みます。
私の場合、それはコードで動作します:
PrintWriter out = new PrintWriter(new File(filePath), "UTF-8");
out.write(csvContent);
out.flush();
out.close();