以UTF-8格式读取CSV文件

6

我正在用Java读取csv文件,在其中添加新信息列,并将其重新导出到CSV文件。 我在以UTF-8格式读取CSV文件时遇到了问题。 我逐行读取并将其存储在StringBuilder中,但是当我打印该行时,我可以看到我正在读取的信息不是UTF-8而是ANSI。 我使用了UTF和printstream的System.out.print,但信息仍然以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格式导出。

5个回答

4

您确定您的CSV文件是UTF-8编码的吗?我猜它不是。尝试使用ISO-8859-1读取文件,但保持输出为UTF-8。(使用UTF8UTF-8通常都可以,但你应该像@Marcelo建议的那样使用UTF-8


1
在这行中:
br = new BufferedReader(new InputStreamReader(new FileInputStream("./users.csv"),"UTF8"));

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

你确定你的文件是UTF-8编码吗?你能用支持UTF-8编码的编辑器打开它吗?在Windows系统中,你可以使用Notepad++来查看源文件的格式。 - Marcelo
我使用Excel和Notepad++检查了源代码,显示源代码是UTF-8编码。 - Ricardo

1

使用UTF编码将内容打印到System.out?为什么这样做?System.out和它使用的编码是在操作系统级别确定的(它成为JVM中的默认字符集),你只想在System.out上使用这个编码。

注意:保留html标签。


我在这个网站上使用了一段代码摘录来打印UTF-8。我只需要看到文件中读取的内容。然而,打印不是问题,文件读取不起作用。 - Ricardo
你怎么确定这件事呢? - Erwin Smout
因为我正在打开生成的CSV文件并以ANSI格式打印出来。我之前发了一个关于写入问题的问题,但我意识到一直是读取的问题。 - Ricardo
你用什么打开生成的CSV文件呢?在你使用的那个软件中,二进制位转换为显示字符是如何进行的呢? - Erwin Smout

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这样的工具进行转换并确信它)。

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/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接