Напишите текстовый файл в кодировке UTF-8 с спецификацией java .nio. - PullRequest
3 голосов
/ 22 января 2020

Мне нужно записать вывод запроса базы данных в файл CSV.

К сожалению, многие люди в моей компании не могут использовать хороший редактор, такой как Notepad ++, и продолжают открывать файлы CSV в Excel.

Когда я пишу текстовый / CSV-файл, используя java.nio, например,

public static void main(String[] args) {
    Path path = Paths.get("U:\\temp\\TestOutput\\csv_file.csv");
    List<String> lines = Arrays.asList("Übernahme", "Außendarstellung", "€", "@", "UTF-8?");

    try {
        Files.write(path, lines, StandardCharsets.UTF_8, StandardOpenOption.CREATE_NEW);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

, файл успешно создается и кодируется в UTF-8.

Теперь проблема заключается в отсутствующей спецификации в этом файле.

Отсутствует спецификация (в кодировке Notepad ++ в правом нижнем углу отображается UTF-8 ), что не является проблемой для Notepad ++

enter image description here

но, очевидно, это для Excel

enter image description here

и когда я использую Параметр Notepad ++ Кодировка> Преобразовать в UTF-8-BOM , сохранить и закрыть его, а затем открыть файл в Excel, он правильно отображает все значения, проблем с кодированием не осталось.

То приводит к следующему вопросу:

Могу ли я заставить java.nio.file.Files.write(...) добавить спецификацию при использовании StandardCharsets.UTF-8 или есть Есть ли другой способ в java.nio для достижения желаемой кодировки?

1 Ответ

1 голос
/ 22 января 2020

Насколько я знаю, в стандартной библиотеке Java NIO нет прямого способа писать текстовые файлы в формате UTF-8 с форматом спецификации.

Но это не проблема, поскольку спецификация - это не что иное, как специальный символ в начале текстового потока, представленный как \uFEFF. Просто добавьте его вручную в файл CSV, например:

List<String> lines = 
    Arrays.asList("\uFEFF" + "Übernahme", "Außendarstellung", "€", "@", "UTF-8?");
        ...
...