gpt4 book ai didi

java - csv中的字符编码

转载 作者:行者123 更新时间:2023-12-01 22:31:17 25 4
gpt4 key购买 nike

我们需要从 Oracle DB 表中选取数据并将该数据转储到 csv 文件和普通的管道分隔文本文件中。在应用程序上向用户提供链接,以便用户可以查看生成的 csv/文本文件。

由于涉及大量解析,因此我们编写了一个 Unix shell 脚本并从 Struts/J2ee 应用程序调用它。

之前我们在生成的文件中丢失了中文和罗马字符,并且生成的文件具有 us-ascii 字符集(使用 -> file -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();

如果我遗漏了任何细节,请告诉我。感谢大家抽出时间来完成此过程。

最佳答案

已经解决了。首先,正如 Aaron 提到的,删除了 UTF-16LE 编码以避免将来出现问题,并将文件编码为 UTF-8。将 Java 代码中的 PrintWriter 更改为 OutputStream 并且能够在我的文本文件中看到正确的字符。

CSV 仍然显示垃圾。了解到我们需要在文件开头添加 EF BB BF,因为 BOM 感知软件(如 MS-Excel)需要它。因此,如下更改 Java 代码就可以解决 csv 问题。

OutputStream out = servletResponse.getOutputStream();
os.write(239); //0xEF
os.write(187); //0xBB
out.write(191); //0xBF
FileInputStream fileInputStream = new FileInputStream(fileLoc + fileName);
int i;
while ((i=fileInputStream.read()) != -1) {
out.write(i);
}
fileInputStream.close();
out.flush();
out.close();

关于java - csv中的字符编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27690286/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com