UTF-8 не работает для Java zipOutputStream - PullRequest
0 голосов
/ 28 января 2019

Я создаю 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 ]

0 голосов
/ 28 января 2019

Я не думаю, что ваш пример верен, потому что вы передаете 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.

0 голосов
/ 28 января 2019

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

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

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

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

...