Подтвердить что ты не робот

Настройка UTF-8 в java и csv файле

Я использую этот код для добавления персидских слов в файл csv через OpenCSV:

String[] entries="\u0645 \u062E\u062F\u0627".split("#");
try{
    CSVWriter writer=new CSVWriter(new OutputStreamWriter(new FileOutputStream("C:\\test.csv"), "UTF-8"));

    writer.writeNext(entries);
    writer.close();
}
catch(IOException ioe){
    ioe.printStackTrace();
}

Когда я открываю полученный файл csv, в Excel он содержит "ứỶờịỆ" . Другие программы, такие как notepad.exe, не имеют этой проблемы, но все мои пользователи используют MS Excel.

Замена OpenCSV на SuperCSV не решает эту проблему.

Когда я печатал персидские символы в файл csv вручную, у меня нет никаких проблем.

4b9b3361

Ответ 1

К сожалению, CSV - это очень специальный формат без метаданных и никакого реального стандарта, который бы предусматривал гибкую кодировку. Пока вы используете CSV, вы не можете надежно использовать любые символы вне ASCII.

Ваши альтернативы:

  • Write to XML (у которого есть метаданные кодирования, если вы делаете это правильно) и импортировать XML в Excel.
  • Используйте Apache POI для создания реальных документов Excel.

Ответ 2

Я потратил некоторое время, но нашел решение для вашей проблемы.

Сначала я открыл блокнот и написал следующую строку: שלום, привет, привет Затем я сохранил его как файл he-en-ru.csv, используя UTF-8. Затем я открыл его с MS excel, и все получилось хорошо.

Теперь я написал простую java-программу, которая печатает эту строку в файле следующим образом:

    PrintWriter w = new PrintWriter(new OutputStreamWriter(os, "UTF-8"));
    w.print(line);
    w.flush();
    w.close();

Когда я открыл этот файл с помощью excel, я увидел "gibrish".

Затем я попытался прочитать содержимое двух файлов и (как ожидалось) увидел, что файл, созданный блокнотом, содержит 3 байта префикса:

    239 EF
    187 BB
    191 BF

Итак, я изменил свой код, чтобы сначала напечатать этот префикс, а затем текст:

    String line = "שלום, hello, привет";
    OutputStream os = new FileOutputStream("c:/temp/j.csv");
    os.write(239);
    os.write(187);
    os.write(191);

    PrintWriter w = new PrintWriter(new OutputStreamWriter(os, "UTF-8"));

    w.print(line);
    w.flush();
    w.close();

И это сработало! Я открыл файл, используя excel, и увидел текст, как я ожидал.

Нижняя строка: напишите эти 3 байта перед записью содержимого. Этот префикс указывает, что содержимое находится в 'UTF-8 с спецификация' (иначе это просто UTF-8 без спецификации).

Ответ 3

Excel не использует UTF8 для открытия файлов CSV. Это известная проблема. Используемая фактическая кодировка зависит от настроек локали Microsoft Windows. Например, с немецким lcoale Excel откроет CSV файл с CP1252.

Вы можете создать файл Excel, содержащий некоторые персидские символы, и сохранить его как файл CSV. Затем напишите небольшую программу Java, чтобы прочитать этот файл и протестировать некоторые общие кодировки. То, как я использовал, чтобы определить правильную кодировку немецких умляутов в файлах CSV.