UTF-8不适用于Java zipOutputStream

时间:2019-01-28 12:29:03

标签: java kotlin zipoutputstream

我正在使用ZipOutputStream生成一个包含csv的zip文件。我已经通过了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 :(得分:1)

从文档中:

  

字符集-用于编码条目名称和注释的字符集

因此,设置UTF-8对已经必须是字节流的内容没有任何影响。

问题必须在CsvWriter中发生。

答案 1 :(得分:1)

我认为您的示例不正确,因为您是直接将ZipOutputStream传递给CsvWriter。假设您使用的是OpenCSV,则CsvWriter构造函数需要一个Writer,而不是OutputStream

在Java中,I / O流要么是字节流,要么是原始数据。或由Unicode字符组成的字符流。为了从一个转换为另一个,您必须提供一个字符编码,告诉它如何将字符转换为字节。 (如果不提供,则Java将使用默认的字符编码-取决于平台,但通常为UTF-8。)InputStreamOutputStream是字节流,而对应的字符流称为ReaderWriter

您有一个ZipOutputStream,它是一个字节流。 OpenCSV CsvWriter构造函数需要Writer(一个字符流),这很有意义,因为CSV是一种文本格式。 (我想这对其他CsvWriter实现也是如此。)您应该将ZipOutputStream包装在OutputStreamWriter的实例中,该实例会将CSV字符转换为字节。您可以在OutputStreamWriter构造函数中指定字符编码。