установка UTF-8 в java и csv-файле [дубликат]

этот вопрос уже есть ответ здесь:

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

String[] entries="u0645 u062Eu062Fu0627".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, он содержит "ứỶờịỆ". Другие программы, такие как блокнот.exe не имеют этой проблемы, но все мои пользователи используют MS Excel.

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

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

3 ответов


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

ваши варианты:

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

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

сначала я открыл блокнот и написал следующие строки: שלום, привет, привет Затем я сохранил его как файл 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."

затем я попытался прочитать содержимое 2 файлов и (как и ожидалось) увидел, что файл, сгенерированный блокнотом, содержит префикс 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 с BOM' (в противном случае это просто "UTF-8 без BOM").


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

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