【发布时间】:2011-05-22 07:12:13
【问题描述】:
我有一个 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 值。
请提出建议。
【问题讨论】:
-
如果您以前没有遇到过这种情况,请注意 Unicode 标准不要求或不推荐使用带有 UTF-8 的 BOM。它也不违法,但不应随意使用。有关详细信息,请参阅here,包括有关何时何地使用它的一些指南。如果您尝试在 Windows 中查看 csv 文件,这可能是对 BOM 的有效使用。
-
是的,我们正在尝试在 Windows 中查看 csv,但生成的 csv 仍然显示德语字符的乱码。这是设置 BOM 的正确方法吗?
-
是的,没错。 Unicode 标准建议反对使用带有 UTF-8 的所谓 BOM(实际上并非如此)。
-
@tchrist:它建议在处理除仅 ASCII 字符之外的软件和协议时不要使用 BOM。如果 OP 知道他正在使用的 Windows 软件将使用 BOM 来检测文件实际上是用 UTF-8 编码的(我们不关心它不是 BOM 的事实,我们关心的是 事实上它可以让一些软件检测到编码是UTF-8)。另请注意,如果您有一个 UTF-8 的 BOM 并且某些软件出现故障,那么这些软件就会损坏,因为 UTF-8 开头的 BOM 是完全有效的。
-
为了 BOM 讨论的完整性。 Excel 2003 严格要求 UTF-8 编码的 CSV 文件中的 BOM。否则多字节字符是不可读的。
标签: java character-encoding oracle10g byte-order-mark