使用 DotNetZip 库解压包含非 ASCII 字符的文件

2024-02-23

我正在尝试使用 DotNetZip 库解压缩文件。

该文件包含带有丹麦语字符 (æøåÆØÅ) 的文件夹和文件。

TotalCommander、7Zip、Windows 自己的 zip 都能正确提取文件,但 DotNetZip Library 会破坏丹麦语字符。

Ex: File_æøåÆØÅ.txt变成File_æ¢åÆ¥Å.txt

代替它包含一个¢。 代替Ø它包含一个¥.

Code:

using (var zipFile = ZipFile.Read(@"File_æøåÆØÅ.zip"))
{
     zipFile.ExtractAll(@"File_æøåÆØÅ",
                        ExtractExistingFileAction.OverwriteSilently);
}

我使用默认编码(“da-DK”文化),我尝试过其他编码,例如 UTF8 等。

如何解压缩包含丹麦字符文件名的文件?


要处理该 zip 文件,请在读取 zip 时显式指定丹麦语代码页:

var encoding = System.Text.Encoding.GetEncoding("da-DK");
using (var zipFile = ZipFile.Read(@"File_æøåÆØÅ.zip", encoding)) {
  zipFile.ExtractAll(@"File_æøåÆØÅ",
                     ExtractExistingFileAction.OverwriteSilently);
} 

您需要明确执行此操作的原因:
zip 规范允许 zip 文件中的文件名和注释使用两种文本编码:IBM437 和 UTF8。当使用这些兼容编码中的任何一个时,zip文件元数据会显式指定它。 DotNetZip 或任何库都可以放心地使用 zip 文件中指定的编码。

zip 文件无法指定不是这两种编码之一的编码。 zip 规范没有提供执行此操作的方法。某些 zip 库或工具构建的 zip 文件不符合这方面的规范; zip 文件使用“da-DK”或 CP950 等文本编码。严格来说,它们不符合规范,但工具仍然可以构建它们。像这样的 Zip 文件并不少见。

在这种情况下,某些库或工具会猜测 zip 文件中使用的编码与计算机上的默认编码相同。这并不安全,也不能保证有效,但这是一个适用于小情况的假设 - zip 文件是由本地计算机上不兼容的库或工具创建的。如果您使用默认(不兼容)文本编码构建 zip 文件,然后将其从斯德哥尔摩发送到上海,则在读取时使用“假定默认编码”策略将会失败。

DotNetZip 没有做出这样的假设。如果 zip 文件使用不兼容的文本编码,则 zip 文件中不会指示使用哪种编码,因此 DotNetZip 使用标准编码 - IBM437 - 来读取文件。 DNZ 无法知道这是“错误的”。如果您想覆盖该行为,您需要使用接受不同编码的 ZipFile.Read() 方法。

这一切都在DotNetZip 文档 http://dotnetzip.codeplex.com/documentation,特别是在ZipFile.ProvisionalAlternateEncoding http://cheeso.members.winisp.net/DotNetZipHelp/html/aecbb638-1ecf-807e-b933-5bb1a2a95e81.htm财产。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 DotNetZip 库解压包含非 ASCII 字符的文件 的相关文章