使用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
相关产品推荐
相关产品推荐

