人们这些天来创建使用WinZip,它允许国际化(即非拉丁语:西里尔文,希腊,中国,你的名字)的ZIP压缩文件的文件名

不幸的是,试图解压缩这样的文件会造成麻烦: UNIX解压创建垃圾命名的文件和显示目录,如“®£¤¤©¥EI”。 Java和其jar命令这次得分失败上这些档案。

有没有以编程方式解压此类文件差强人意的方式吗? UNIX或Java。

有帮助吗?

解决方案 2

在溶液我发现: 阿帕奇公地压缩可以解压缩这些存档就好,如果以正确的字符集后备供给。

其他提示

DotNetZip 支持Unicode和任意编码为zipfiles内的文件名,无论是用于读或写拉链。

这是一个NET库。对于Unix的使用,你需要单作为先决条件。

如果zip文件被正确地通过的WinZip构造,换言之,如果是符合的从PKWARE 拉链规范,再有就是你需要做的,以指定在您打开它时的编码没有特别的工作。据拉链规范,也有zipfiles用于文件名支持的两种编码:UTF-8和IBM437。使用一个或另一这些编码中的拉链元数据和任何拉链库可以的检测和使用它被指定。 DotNetZip读兼容的拉链时自动检测到它。像这样:

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.归档程序编码。 WinRAR是一个 - 它会创建已编码的文件名中的默认编码在电脑上使用的拉链。在上海,它将使用CP950,而在冰岛,别的东西,在里斯本,别的东西。这里的优势,以“未达标”的是,Windows资源管理器将打开并正确显示在这样的国际化拉链-化的文件名。换言之,“不达标”往往是人们想要什么,因为Windows不(没?)支持UTF-8的zip文件。

(这一切都与在压缩文件所使用的编码,而不是在包含在压缩文件中的文件所使用的编码做)

在拉链规范不允许在zip元数据的任意的文本编码的规格。换句话说,如果你创建ZIP时要使用CP950,那么你提取逻辑需要“知道”提取时使用CP950 - 没有在zip文件中携带的信息。此外,当然,压缩库您使用以编程方式提取必须支持任意编码。据我所知,Java的拉链图书馆没有。 DotNetZip一样。像这样:

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

DotNetZip还可以创建zip文件具有任意的编码 - “非顺应性”拉链。

DotNetZip是免费的,开源的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top