我正在尝试使用 DotNetZip 库解压缩文件。
该文件包含带有丹麦语字符 (æøåÆØÅ) 的文件夹和文件。
TotalCommander、7Zip、Windows 自己的 zip 都能正确提取文件,但 DotNetZip Library 会破坏丹麦语字符。
Ex: File_æøåÆØÅ.txt
变成File_æ¢åÆ¥Å.txt
代替aø
它包含一个¢
。
代替Ø
它包含一个¥
.
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(使用前将#替换为@)