我们需要从 Oracle DB 表中挑选数据并将该数据转储到 csv 文件和纯管道分隔的文本文件中。在应用程序上为用户提供链接,以便用户可以查看生成的 csv/文本文件。
由于涉及到大量的解析,所以我们编写了一个 Unix shell 脚本并从 Struts/J2ee 应用程序中调用它。
早些时候,我们在生成的文件中丢失了中文和罗马字符,生成的文件有 us-ascii 字符集(使用-> 文件 -i 进行检查)。后来我们使用 NLS_LANG=AMERICAN_AMERICA.AL32UTF8
了,这给了我们 utf-8 格式的文件。
但是字符仍然是乱码,所以我们再次尝试了 iconv 命令并将 utf-8 文件转换为 utf-16le 字符集。
iconv -f utf-8 -t utf-16le $recordFile > $tempFile
这适用于生成的文本文件。但是对于 CSV,中文和罗马字符仍然不正确。现在,如果我们在记事本中打开这个 csv 文件并通过按键盘上的 Enter 键换行,保存它。用 MS-Excel 打开它,所有字符都很好,包括中文和罗马,但现在每行的文本都是单行而不是列。
不知道发生了什么。
Java 代码
PrintWriter out = servletResponse.getWriter();
servletResponse.setContentType("application/vnd.ms-excel; charset=UTF-8");
servletResponse.setCharacterEncoding("UTF-8");
servletResponse.setHeader("Content-Disposition","attachment; filename="+ fileName.toString());
FileInputStream fileInputStream = new FileInputStream(fileLoc + fileName);
int i;
while ((i=fileInputStream.read()) != -1) {
out.write(i);
}
fileInputStream.close();
out.close();
如果我错过了任何细节,请告诉我。感谢大家抽出时间来解决这个问题。