【发布时间】:2012-05-25 12:06:58
【问题描述】:
在 C# 中,我的应用程序在 Windows Server 2008 R2 上运行,我需要能够提取在 Windows 或 MAC OSX 上创建的任何 ZIP 文件。我目前正在使用DotNetZip library。
但是这个库在提取文件名中带有特殊北欧字符的 MACOSX ZIP 档案时遇到了问题。我尝试在 Encoding.GetEncoding(string) 方法中指定不同的编码,包括 macintosh。
Windows 内置的 zip 工具也会弄乱特殊字符。 WinRAR 3.x 也可以。但是 WinRAR 4.x 似乎是唯一能正确完成这项工作的工具。
是否有可能使用任何可用的 C# ZIP 库来提取这样的 ZIP 存档?
更新:这是一个使用 Mac OSX 中默认 Zip 功能创建的 zip 存档的示例。第一个屏幕截图显示了 Windows Zip 功能如何无法解码文件名。第二个屏幕截图显示了使用 WinRAR 4.11 打开的存档:
从 Mac OSX 下载sample ZIP archive
【问题讨论】:
-
DotNetZips 演示 UI 工具能否管理数据提取?如果 WinRAR4 可以做到,为什么不通过 Process 类使用它呢?
-
你试过自然的“北欧”编码吗(我不知道它可能是什么)。听起来您遇到了已知的 zip 文件陷阱之一。如果它没有编码为 IBM437,也没有编码为 UTF8,则无法自动确定文件名使用什么编码。可以对此类 zip 文件进行解码,但在读取时,需要指定创建时使用的编码。它是在 Mac 上创建的并不重要。相关部分是创建期间使用的文本编码。在 DotNetZip 中,
ZipFile.Read()的重载允许您指定它。 -
您能否举一个 DotNetZip 出错的字符的具体示例——Mac 认为它应该是什么与 DotNetZip 说它是什么?另外,你知道 zipfile 是用什么编码创建的吗? (如果没有,你能把它贴在某个地方以便其他人可以弄清楚吗?)这可能只是 NFD 与 NFC UTF-8 的问题吗?
-
@Adrian 我宁愿不依赖安装 WinRAR,因为该应用程序已部署到许多客户安装中。
-
@Adrian 刚刚尝试了 DotNetZip 演示 UI 工具,它适用于 UTF-8 编码。我之前在我的代码中尝试过,但没有运气 - 但我现在将检查这个工具的源代码以使其正确。感谢您的建议。