Персонажи превращаются в специальные символы - PullRequest
0 голосов
/ 21 июня 2019

Я использую 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

Я что-то пропустил?

Ответы [ 2 ]

3 голосов
/ 21 июня 2019

Я подозреваю, что это Excel, который читает UTF-8 в кодировке CSV как ANSI.Это происходит, когда вы просто открываете CSV в Excel без использования мастера импорта текста.Тогда Excel всегда ожидает ANSI, если в начале файла нет 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, он будет выглядеть так:

enter image description here

Теперь мы делаем то же самое, но имеем

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

активный.

Это приводит к Excel, например, когда test.csv просто открывается с помощью Excel:

enter image description here

Конечно,лучшим подходом всегда является использование Excel мастера импорта текста .

См. также Экспорт Javascript в CSV-кодировку utf-8, проблема для той же проблемы.

1 голос
/ 21 июня 2019

untre un membre clé "UTF8" = Être un membre clé "ANSI"

проверьте код символа того, как вы читаете окончательный файл.

...