gpt4 book ai didi

java - 解压缩使用 WinZIP 创建的具有 I18N 文件名的文件?

转载 作者:搜寻专家 更新时间:2023-11-01 02:34:32 25 4
gpt4 key购买 nike

现在人们使用 WinZIP 创建他们的 ZIP 文件,WinZIP 允许国际化(即非拉丁语:西里尔文、希腊文、中文,随便你怎么命名)文件名。

遗憾的是,试图解压这样的文件会导致麻烦:UNIX 解压缩会创建垃圾命名文件和目录,如“®£¤ ©¤¥èì”。Java 及其 jar 命令在处理此类存档时惨遭失败。

是否有可行的方法以编程方式解压缩此类文件? UNIX 或 Java。

最佳答案

DotNetZip支持 zip 文件中文件名的 unicode 和任意编码,用于读取或写入 zip。

这是一个 .NET 库。对于 Unix 使用,您需要 Mono 作为先决条件。

如果压缩文件由 WinZip 正确构建,换句话说,如果它符合 the zip spec from PKWare ,那么在解压它时,您不需要做任何特殊的工作来指定编码。根据 zip 规范,有两种受支持的编码用于 zip 文件中的文件名:UTF-8 和 IBM437。这些编码中的一种或另一种的使用在 zip 元数据中指定,任何 zip 库都可以检测和使用它。 DotNetZip 在读取兼容的 zip 时自动检测它。像这样:

using (var zip = ZipFile.Read("thearchive.zip"))
{
foreach (var e in zip)
{
// e.FileName refers to the name on the entry
e.Extract("extract-directory");
}
}

有些存档程序会生成“不符合”w.r.t. 的 zip。编码。 WinRar 就是其中之一——它将创建一个 zip,其中的文件名以计算机上使用的默认编码进行编码。在上海,它将使用 cp950,而在冰岛,则使用其他语言,而在里斯本,则使用其他语言。此处“不合规”的优点是 Windows 资源管理器将打开并正确显示此类 zip 中的国际化文件名。换句话说,“不合规”通常是人们想要的,因为 Windows(还?)不支持 UTF-8 zip 文件。

(这都与压缩文件中使用的编码有关,而不是压缩文件中包含的文件使用的编码)

zip 规范不允许在 zip 元数据中指定任意文本编码。换句话说,如果您在创建 zip 时使用 cp950,那么您的提取逻辑需要“知道”在提取时使用 cp950 - zip 文件中没有任何内容包含该信息。此外,当然,您用于以编程方式提取的 zip 库必须支持任意编码。据我所知,Java 的 zip 库没有。 DotNetZip 可以。像这样:

using (ZipFile zip = ZipFile.Read(zipToExtract,
System.Text.Encoding.GetEncoding(950)))
{
foreach (ZipEntry e in zip)
{
e.Extract(extractDirectory);
}
}

DotNetZip 还可以创建具有任意编码的 zip 文件 - “不兼容”的 zip。

DotNetZip 是免费的开源软件。

关于java - 解压缩使用 WinZIP 创建的具有 I18N 文件名的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1832650/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com