UTF-8 не работает для Java zipOutputStream

Я создаю ZIP-файл, содержащий CSV, используя ZipOutputStream, Я прошел кодировку UTF-8, но проблема в том, что немецкие умляуты не сжимаются должным образом. При распаковке они не отображаются должным образом в файле.

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

Все темы, связанные с этой проблемой, в основном касаются специальных символов в имени файла, но для меня проблема заключается в данных.

   val zos = ZipOutputStream (outputStream, StandardCharsets.UTF_8)
        val entry = ZipEntry("file1.csv")
        zos.putNextEntry(entry)

        val writer = CsvWriter(zos)

        for (entr in data)
            writer.appendRow {entr.forEach { write(it) }}
        zos.closeEntry()
    zos.close()

2 ответа

Из документа:

charset - кодировка, которая будет использоваться для кодирования имен записей и комментариев

Таким образом, настройка UTF-8 не влияет на контент, который уже должен быть потоком байтов.

Проблема должна возникнуть в CsvWriter,

Я не думаю, что ваш пример верен, потому что вы передаете ZipOutputStream прямо к CsvWriter, Предполагая, что вы используете OpenCSV, CsvWriter конструктор нуждается в Writerне OutputStream,

В Java потоки ввода / вывода являются байтовыми потоками, которые являются необработанными данными; или символьные потоки, которые состоят из символов Unicode. Чтобы преобразовать один в другой, вы должны предоставить кодировку символов, которая сообщает, как преобразовывать символы в / из байтов. (Если вы не предоставите один, то Java будет использовать кодировку символов по умолчанию - которая зависит от платформы, но обычно это UTF-8.) InputStream а также OutputStream являются байтовыми потоками, в то время как соответствующие символьные потоки называются Reader а также Writer,

У тебя есть ZipOutputStream, который является потоком байтов. OpenCSV CsvWriter конструктор требует Writerсимвольный поток, который имеет смысл, потому что CSV - это текстовый формат. (Я полагаю, что это будет верно для других CsvWriter реализации также.) Вы должны обернуть ZipOutputStream в случае OutputStreamWriter, который преобразует символы CSV в байты. Вы можете указать кодировку в OutputStreamWriter конструктор.

Другие вопросы по тегам