You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Apache Commons CSV生成CSV时西里尔字符乱码,求UTF-8配置方案

解决Apache Commons CSV写入西里尔字符乱码问题

你当前使用Apache Commons CSV生成CSV文件时,西里尔字符出现乱码,核心问题是**FileWriter默认采用系统默认编码**,而非UTF-8。要解决这个问题,只需替换FileWriter为OutputStreamWriter,并明确指定UTF-8编码即可。

原问题代码

package ru.nikita;
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVPrinter;

import java.io.FileWriter;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;

public class CSVWriter {
    private final String filePath;
    private final char delimiter;

    public CSVWriter(String filePath) {
        this.filePath = filePath;
        this.delimiter = ';';
    }

    public void writeCSV(ArrayList<String> data){
        try (FileWriter writer = new FileWriter(filePath, true);
             CSVPrinter csvPrinter = new CSVPrinter(writer, CSVFormat.DEFAULT.withDelimiter(this.delimiter))
        ) {
            csvPrinter.printRecord(data);
            csvPrinter.flush();
            csvPrinter.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

修改后的代码(指定UTF-8编码)

package ru.nikita;
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVPrinter;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;

public class CSVWriter {
    private final String filePath;
    private final char delimiter;

    public CSVWriter(String filePath) {
        this.filePath = filePath;
        this.delimiter = ';';
    }

    public void writeCSV(ArrayList<String> data){
        try (OutputStreamWriter writer = new OutputStreamWriter(
                new FileOutputStream(filePath, true), StandardCharsets.UTF_8);
             CSVPrinter csvPrinter = new CSVPrinter(writer, CSVFormat.DEFAULT.withDelimiter(this.delimiter))
        ) {
            csvPrinter.printRecord(data);
            csvPrinter.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

关键改动说明

  • 替换FileWriter为OutputStreamWriter,结合FileOutputStream使用,支持手动指定编码格式。
  • 通过StandardCharsets.UTF_8明确指定UTF-8编码,确保西里尔字符正确写入。
  • 移除手动调用csvPrinter.close(),try-with-resources会自动关闭资源,无需手动操作。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 12:27:29