6

我正在读取 java 中的 csv 文件,添加一个包含新信息的新列并将其导出回 CSV 文件。我在读取 UTF-8 格式的 CSV 文件时遇到问题。我逐行读取并将其存储在 a 中StringBuilder,但是当我打印该行时,我可以看到我正在读取的信息不是 UTF-8 而是 ANSI。我使用了UTFSystem.out.printprintstreamUTF,信息仍然显示在 ANSI 中。这是我的代码:

    BufferedReader br;
    try {
        br = new BufferedReader(new InputStreamReader(new FileInputStream(
                "./users.csv"), "UTF8"));
        String line;
        while ((line = br.readLine()) != null) {
            if (line.contains("none@none.com")) {
                continue;
            }
            if (!line.contains("@") && !line.contains("FirstName")) {
                continue;
            }
            PrintStream ps = new PrintStream(System.out, true, "UTF-8");
            ps.print(line + "\n");
            sbusers.append(line);
            sbusers.append("\n");
            sbusers2.append(line);
            sbusers2.append(",");
        }
        br.close();
    } catch (IOException e) {
        System.out.println("Failed to read users file.");
    } finally {
    }

它打印出诸如“Professor -P�s”之类的信息。由于读取未正确完成,新文件的输出也以 ANSI 格式导出。

4

5 回答 5

4

您确定您的 CSV 已UTF-8编码吗?我的猜测是它不是。尝试使用ISO-8859-1读取文件,但保持输出为UTF-8. (UTF8并且UTF-8两者都倾向于工作,但您应该UTF-8按照@Marcelo 的建议使用)

于 2013-09-30T17:50:17.953 回答
1

在行中:

br = new BufferedReader(new InputStreamReader(new FileInputStream("./users.csv"),"UTF8"));

"UTF-8"你的字符集不应该是"UTF8".

于 2013-09-30T17:47:28.890 回答
1

使用 UTF 编码打印到 System.out ????????????

为什么要这么做 ?System.out 和它使用的编码是在操作系统级别确定的(它成为 JVM 中的默认字符集),这是您想要在 System.out 上使用的唯一字符集。

于 2013-09-30T17:50:03.470 回答
1

正如@Marcelo 所建议的那样,拳头使用UTF8代替UTF-8

BufferedReader in = new BufferedReader(
       new InputStreamReader(
                  new FileInputStream("./users.csv"), "UTF8"));

其次,忘记PrintStream使用System.out,或者更好的是日志 API。您无需担心 Java 将如何将您的字符串输出到控制台(关于字符编码的第一条规则:在您成功读取内容后,让 Java 处理编码,只有在您写入外部文件/数据库/等)。

第三,更重要的是,检查您的文件是否真的以 UTF-8 编码,这是 99% 的编码问题的原因。

确保使用真正的 UTF-8 文件进行测试(使用 iconv 等工具转换为 UTF-8 并确保它)。

于 2013-09-30T17:57:08.980 回答
0

找到了一个潜在的解决方案(我有同样的问题)。根据 UTF-8 编码的类型,您需要指定是否进一步...

代替:

br = new BufferedReader(new InputStreamReader(new FileInputStream(
            "./users.csv"), "UTF8"));

和:

br = new BufferedReader(new InputStreamReader(new FileInputStream(
            "./users.csv"), "ISO_8859_1"));

进一步了解:https ://mincong.io/2019/04/07/understanding-iso-8859-1-and-utf-8/

于 2020-03-17T20:38:58.373 回答