【问题标题】:UTF-8 is not working for Java zipOutputStreamUTF-8 不适用于 Java zipOutputStream
【发布时间】:2019-01-28 12:29:02
【问题描述】:

我正在使用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()

【问题讨论】:

  • 将 csv 转换为 zip
  • CsvWriter 来自哪里,data 是什么?

标签: java kotlin zipoutputstream


【解决方案1】:

来自文档:

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

所以设置 UTF-8 对已经是字节流的内容没有任何影响。

问题一定出现在CsvWriter

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • CsvWriter 可以在参数中使用旧版本的 outputStream。他的程序编译并运行,所以它不可能是那样的。
    • 它可能接受一个操作系统,但它可能只是使用默认字符集将它包装在 OutputStreamWriter 中。
    猜你喜欢
    • 2016-06-05
    • 1970-01-01
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    相关资源
    最近更新 更多