java - 字符被转换为特殊字符

标签 java utf-8 apache-poi locale

我正在使用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

我是不是错过了什么?

最佳答案

我怀疑是ExcelUTF-8编码的CSV读取为ANSI。当您仅在 Excel 中打开 CSV 而不使用文本导入向导时,就会发生这种情况。如果文件开头没有 BOM,则 Excel 始终期望 ANSI。如果您使用支持 Unicode 的文本编辑器打开 CSV,一切都会正确。

示例:

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();

 }
}

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

enter image description here

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

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

活跃。

test.csv 只需由 Excel 打开时,Excel 的结果如下:

enter image description here

当然,更好的方法始终是使用 ExcelText Import Wizard .

另请参阅Javascript export CSV encoding utf-8 issue对于同样的问题。

关于java - 字符被转换为特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56705947/

相关文章:

java - 多线程测试

从西里尔字母转换为拉丁字母 C

python - UTF-8 转 ISO-8859-1 编码 : replace special characters with closest equivalent

java - 将行导出到 Excel 时如何替换默认的 jtable 列值 - Java

java - Android Context.bindService 总是返回 false 并且永远不会触发 ServiceConnection 对象

java - Twitter 转发量

mysql - UTF-8编码问题

apache - 在 Apache POI HSSF 中,单元格类型仍然显示为 "General"Excel,即使它是数字格式的

excel - 如何仅获取 Apache POI 中未隐藏的工作表数量

java - Google App Engine 上的 key 是有序的