gpt4 book ai didi

c# - 使用 DotNetZip 库解压非 ASCII 字符的文件

转载 作者:太空狗 更新时间:2023-10-30 00:57:39 24 4
gpt4 key购买 nike

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

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

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

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

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

代码:

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

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

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

最佳答案

要处理该 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。当使用这些兼容编码中的任何一种时,zipfile 元数据都会明确指定它。 DotNetZip 或任何库都可以自信地使用 zip 文件中指定的编码。

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

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

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

这在 DotNetZip documentation 中都有描述。 ,特别是在 ZipFile.ProvisionalAlternateEncoding属性(property)。

关于c# - 使用 DotNetZip 库解压非 ASCII 字符的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4654860/

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