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
конструктор.