【发布时间】:2021-10-27 05:54:34
【问题描述】:
我正在开发一种工具,该工具可以生成包含一些生成文件的 zip。我的一些使用 Windows 10 的用户报告说,当我将字符串添加到 zip 中的文件中时,非 ascii 字符被替换为“?” 这真的很奇怪,因为它在 linux (nixos) 上完美运行。你有什么想法吗?
fis = new ByteArrayInputStream(content.getBytes(StandardCharsets.UTF_8));
...
public static void addToZip(String zipFilePath, final InputStream fis, final ZipOutputStream zos)
throws IOException {
final ZipEntry zipEntry = new ZipEntry(zipFilePath);
zipEntry.setLastModifiedTime(FileTime.fromMillis(0L));
zos.putNextEntry(zipEntry);
final byte[] bytes = new byte[1024];
int length;
while ((length = fis.read(bytes)) >= 0)
zos.write(bytes, 0, length);
zos.closeEntry();
fis.close();
if (!(Settings.PROTECTION.toBool()))
return;
zipEntry.setCrc(bytes.length);
zipEntry.setSize(new BigInteger(bytes).mod(BigInteger.valueOf(Long.MAX_VALUE)).longValue());
}
...
final ZipOutputStream zos = new ZipOutputStream(fos, StandardCharsets.UTF_8);
【问题讨论】:
-
ZipOutputStream带有字符编码?该类在哪个包中? -
他们如何检查这个以查看“?”?
-
他们很可能会保存他们的文件 windows-1252 编码并且您正在阅读 utf_8 样式。
-
@g00se 我猜它是Java中的那个,见ZipOutputStream(OutputStream out, Charset charset)
-
做
zipEntry.setCrc(bytes.length);毫无意义。那不是该领域的用途。也就是说,您需要提供一个 minimal reproducible example 来实际演示问题。