我有一个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。
请建议。
9条答案
按热度按时间wqnecbli1#
这将正确地将0xEF 0xBB 0xBF写入文件,该文件是BOM表的UTF-8表示形式。
vaj7vani2#
以防人们 * 正在 * 使用
PrintStream
s,您需要稍微改变一下。虽然Writer
可以将单个字节转换为3个字节,但PrintStream
需要单独使用UTF-8 BOM的所有3个字节:或者,您可以直接使用十六进制值:
ftf50wuq3#
要用UTF-8编写BOM,需要
PrintStream.print()
,而不是PrintStream.write()
。另外,如果你想在
csv
文件中包含BOM,我猜你需要在putNextEntry()
之后打印BOM。uurity8g4#
PrintStream#print
我认为
out.write('\ufeff');
实际上应该是out.print('\ufeff');
,调用java.io.PrintStream#print
方法。根据javadoc,
write(int)
方法实际上写入了一个字节。没有任何字符编码。所以out.write('\ufeff');
写入字节0xff
。相比之下,print(char)
方法使用流的编码将字符编码为一个或多个字节,然后写入这些字节。如section 23.8 of the Unicode 9规范所述,UTF-8的BOM是
EF BB BF
。这个序列就是在'\ufeff'
上使用UTF-8编码时得到的结果。参见:Why UTF-8 BOM bytes efbbbf can be replaced by \ufeff?。1tu0hz3e5#
您将此添加为CSV字符串的第一个
这个工作对我来说。
azpvetkf6#
如果你只是想
修改同一个文件
(没有新文件,删除旧文件,因为我有问题)
bpzcxfmw7#
在我的例子中,它使用代码:
jvlzgdj98#
这里有一个简单的方法来附加BOM头的任何文件:
5m1hhzi49#
使用StringBuilder