You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过Apache CSV以UTF-8编码写入CSV文件?

解决CSV文件UTF-8编码在Excel中乱码的问题

你遇到的问题其实是CSV编码场景下的两个常见陷阱,我来帮你拆解并解决:

为什么在线验证器显示ASCII-8BIT?

如果你的测试数据全是ASCII范围内的字符(比如英文字母、数字、基础符号),UTF-8编码的文件和ASCII编码的文件在字节层面是完全一致的——因为UTF-8对ASCII字符的编码就是单字节的ASCII值。很多检测工具会因此把这类文件识别为ASCII-8BIT,但本质上它还是UTF-8。只要你写入非ASCII字符(比如中文、特殊符号),工具就会正确识别为UTF-8了。

为什么Excel打开会乱码?

这是Windows平台Excel的老问题:它默认不会自动识别无BOM的UTF-8 CSV文件,会用系统默认编码(比如GBK、GB2312)来解析文件,导致非ASCII字符乱码。而Files.newBufferedWriter()默认生成的UTF-8文件是不带BOM(字节顺序标记)的,这就是乱码的核心原因。

解决方案:给UTF-8 CSV添加BOM头

你只需要在写入任何内容之前,先写入UTF-8的BOM字符\uFEFF,就能让Excel正确识别UTF-8编码了。修改后的代码如下:

Path filePath = Paths.get("your-output.csv");
try (BufferedWriter writer = Files.newBufferedWriter(filePath, StandardCharsets.UTF_8);
     CSVPrinter csvPrinter = new CSVPrinter(writer, CSVFormat.EXCEL)) {
    // 写入UTF-8 BOM头,让Excel正确识别编码
    writer.write('\uFEFF');
    
    // 写入表头和数据
    csvPrinter.printRecord(headers);
    csvPrinter.printRecord("value1", "value2", "中文测试内容");
    // 循环写入其他数据...
} catch (IOException e) {
    e.printStackTrace();
}

另外建议你明确指定StandardCharsets.UTF_8,虽然Files.newBufferedWriter()默认是UTF-8,但显式声明能避免因环境默认编码变化导致的潜在问题。

这样修改后,Excel就能正常显示UTF-8字符,同时当你写入非ASCII内容时,在线验证器也会正确识别为UTF-8编码了。

内容的提问来源于stack exchange,提问作者Denis Stephanov

火山引擎 最新活动