Java: проблемы с чтением / записью файла UTF-8 .csv, сохраненного в Excel

#java #excel #csv #encoding #vaadin

#java #excel #csv #кодировка #vaadin

Вопрос:

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

             br = new BufferedReader(new InputStreamReader(in));
            out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file)));

            String str;
            while ((str = br.readLine()) != null) {
                out.write(str);
                out.newLine();
            }
            out.flush();
 

При отладке здесь и просмотре выходного файла в Excel он выглядит точно так, как я ожидаю. Допустим, пользователь вводит файл csv, где значение первой ячейки равно «Foo» (без специальных символов); все это, похоже, отображается в Excel и отладчике. Но позже я проанализирую выходной файл для этого значения, просто используя value.contains("Foo") . Это возвращает false только тогда, когда файл csv сохраняется в формате csv UTF-8 в Excel, даже если в соответствии с Excel и значением debugger имеет значение «Foo».

Почему это произошло?

Комментарии:

1. InputStreamReader и OutputStreamWriter лучше всего создавать с явным StandardCharsets.UTF_8 или Charset.defaultCharset() (которое используется по умолчанию). out.write("uFEFF"); перед циклом может помочь распознать UTF-8.

Ответ №1:

проблема может быть в том, что когда вы позже прочитаете файл, вам придется прочитать его в кодировке «UTF-8», например

        InputStreamReader isr = new InputStreamReader(fis, StandardCharsets.UTF_8);