Java 读取UTF-8格式的CSV文件

Java 读取UTF-8格式的CSV文件,java,csv,utf-8,Java,Csv,Utf 8,我正在用java阅读一个csv文件,添加一个包含新信息的新列,并将其导出回csv文件。我在读取UTF-8格式的CSV文件时遇到问题。我逐行阅读并将其存储在StringBuilder中,但当我打印该行时,我可以看到我阅读的信息不是UTF-8,而是ANSI。我在UTF中使用了System.out.print和printstream,信息仍然显示在ANSI中。这是我的代码: BufferedReader br; try { br = new BufferedReader

我正在用java阅读一个csv文件,添加一个包含新信息的新列,并将其导出回csv文件。我在读取UTF-8格式的CSV文件时遇到问题。我逐行阅读并将其存储在
StringBuilder
中,但当我打印该行时,我可以看到我阅读的信息不是UTF-8,而是ANSI。我在UTF中使用了
System.out.print
printstream
,信息仍然显示在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 {
    }
它打印出像“教授-p”这样的信息�s”。由于读取操作不正确,新文件的输出也以ANSI格式导出。

行:

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

您的字符集应该是
“UTF-8”
而不是
“UTF8”

使用UTF编码打印到System.out


你为什么要那样做?System.out及其使用的编码是在操作系统级别确定的(它成为JVM中的默认字符集),并且这是您希望在System.out上使用的唯一字符集。

您确定您的CSV是
UTF-8
编码的吗?我猜不是。尝试使用
ISO-8859-1
读取文件,但将输出保持为
UTF-8
。(
UTF8
UTF-8
两者都会起作用,但您应该按照@Marcelo的建议使用
UTF-8

首先,按照@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并确保其正确性)。

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

替换:

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

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

为了进一步了解:

您确定您的文件是UTF-8格式的,您可以在启用的编辑器中打开它吗?在Windows中,您可以使用Notepad++查看源文件的文件格式。我用excel和Notepad++检查了源文件,它显示源文件是UTF-8格式的。我使用了此网站上发布的代码摘录来打印UTF-8。我只需要查看文件中读取的内容。尽管如此,打印并不是问题,文件的读取不起作用。您如何确切地知道这一点?因为我正在打开生成的CSV,并且正在用ANSI打印出来。大约10分钟前,我发布了一个关于写作问题的问题,但我逐渐意识到这一直都是阅读问题。你打开CSV的时候到底用了什么?在您“打开生成的CSV”的其他软件中,显示字符的二进制位是什么?