web-dev-qa-db-ja.com

JavaでUTF-8 BOMを追加する方法

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の値。

提案してください。

21
Fadd

BOMをUTF-8で書き込むには、PrintStream.print()ではなくPrintStream.write()が必要です。

また、csvファイルにBOMを含める場合は、putNextEntry()の後にBOMを印刷する必要があると思います。

10
axtavt
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(...), StandardCharsets.UTF_8));
out.write('\ufeff');
out.write(...);

これにより、BOMのUTF-8表現である0xEF 0xBB 0xBFがファイルに正しく書き込まれます。

64
astro

念のためあるPrintStreamsを使用する場合は、少し異なる方法で行う必要があります。 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
12

out.write('\ufeff');は実際にはout.print('\ufeff');である必要があると思います。

javadoc によると、write(int)メソッドは実際にはバイトを書き込みます...文字エンコードなしで。したがって、out.write('\ufeff');はバイト_0xff_を書き込みます。対照的に、print(char)メソッドは、ストリームのエンコードを使用して文字を1つまたはバイトとしてエンコードし、それらのバイトを書き込みます。

8
Stephen C

私の場合、それはコードで動作します:

PrintWriter out = new PrintWriter(new File(filePath), "UTF-8");
out.write(csvContent);
out.flush();
out.close();
0
Rocio