为了账号安全,请及时绑定邮箱和手机立即绑定

UTF-8 不适用于 Java zipOutputStream

UTF-8 不适用于 Java zipOutputStream

动漫人物 2022-05-25 10:13:17
我正在使用 .csv 生成一个包含 csv 的 zip 文件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 回答

?
喵喵时光机

TA贡献1846条经验 获得超7个赞

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

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

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


查看完整回答
反对 回复 2022-05-25
?
神不在的星期二

TA贡献1963条经验 获得超6个赞

从文档:

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

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

问题必须发生在CsvWriter.


查看完整回答
反对 回复 2022-05-25
  • 2 回答
  • 0 关注
  • 296 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信