首页 > 解决方案 > 字符被转换为特殊字符

问题描述

我正在使用Apache POI读取.docx文件,并在进行一些操作后写入.csv. .docx我使用的文件是法语的,但是当我在其中写入数据时.csv,会将一些法语字符转换为特殊字符。示例Être un membre clé转换为Être un membre clé

下面的代码用于写入文件

        Path path = Paths.get(filePath);
        BufferedWriter bw = Files.newBufferedWriter(path);
        CSVWriter writer = new CSVWriter(bw);
        writer.writeAll(data);

UTF-8默认使用。

在进行调试时,我在写入.csv数据之前已经检查过它的原样。但它在写作时被转换了?我已将默认语言环境设置为Locale.FRENCH

我错过了什么吗?

标签: javautf-8apache-poilocale

解决方案


我怀疑它Excel读取UTF-8编码CSVANSI. 当您CSVExcel不使用文本导入向导的情况下简单地打开时会发生这种情况。然后Excel总是期望文件开头ANSI是否没有 a 。BOM如果您CSV使用支持的文本编辑器 打开Unicode,一切都会正确。

例子:

import java.io.BufferedWriter;

import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.Files;

import java.util.Locale;
import java.util.List;
import java.util.ArrayList;

import com.opencsv.CSVWriter;

class DocxToCSV {

 public static void main(String[] args) throws Exception {

  Locale.setDefault(Locale.FRENCH);

  List<String[]> data = new ArrayList<String[]>();
  data.add(new String[]{"F1", "F2", "F3", "F4"});
  data.add(new String[]{"Être un membre clé", "Être clé", "membre clé"});
  data.add(new String[]{"Être", "un", "membre", "clé"});

  Path path = Paths.get("test.csv");
  BufferedWriter bw = Files.newBufferedWriter(path);

  //bw.write(0xFEFF); bw.flush(); // write a BOM to the file

  CSVWriter writer = new CSVWriter(bw, ';', '"', '"', "\r\n");
  writer.writeAll(data);
  writer.flush();
  writer.close();

 }
}

现在,如果您test.csv使用支持的文本编辑器 打开Unicode,一切都会正确。但是,如果您使用它打开相同的文件,Excel它看起来像:

在此处输入图像描述

现在我们做同样的事情,但有

bw.write(0xFEFF); bw.flush(); // write a BOM to the file

积极的。

Excel当由以下人员test.csv简单地打开时,这会导致这样的结果Excel

在此处输入图像描述

当然,更好的方法是始终使用Excel文本导入向导” 。

有关相同问题,另请参阅Javascript export CSV encoding utf-8问题。


推荐阅读