以UTF-8格式读取CSV文件

时间:2013-09-30 17:41:30

标签: java csv utf-8

我正在java中读取一个csv文件,添加一个包含新信息的新列并将其导出回CSV文件。我在读取UTF-8格式的CSV文件时遇到问题。我逐行阅读并将其存储在StringBuilder中,但是当我打印该行时,我可以看到我正在阅读的信息不是UTF-8,而是ANSI。我在UTF中使用System.out.printprintstream,信息仍显示在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格式导出。

5 个答案:

答案 0 :(得分:4)

您确定CSV是UTF-8编码的吗?我的猜测是不是。尝试使用ISO-8859-1来读取文件,但请将输出保持为UTF-8。 (UTF8UTF-8两者都有效,但你应该使用UTF-8作为@Marcelo建议的)

答案 1 :(得分:1)

在行中:

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

您的字符集应为"UTF-8"而不是"UTF8"

答案 2 :(得分:1)

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

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

答案 3 :(得分: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并确保它。)

答案 4 :(得分: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/