ZipArchiveEntry 名称和注释遵循 UTF8 标志

可以使用参数 Encoding 创建 ZipArchive,该参数用于解码 ZIP 存档中条目的名称和注释。 .NET 7 引入了一个回归,其中默认使用此编码,如果未提供编码,则回退到系统默认代码页(.NET Core 中的 UTF8)。 .NET 9 中更正了此回归:如果条目的常规用途位标志指示应使用 UTF8,则遵循此标志。 如果未设置 UTF8 位标志,则使用用户提供的编码(如果未提供任何代码页,则使用现有的回退到系统默认代码页)。

旧行为

在 .NET 7 和 .NET 8 中,如果使用用户指定的 entryNameEncoding 参数实例化 ZipArchive,则解码 ZIP 存档中条目的名称和注释时,始终使用此编码。 即使条目具有位集来表示其名称和注释在 UTF8 中编码,也使用 entryNameEncoding

新行为

从 .NET 9 开始,当对 ZIP 存档条目的名称和注释进行解码时,将遵循其 UTF8 位标志。 用户提供的 entryNameEncoding 参数仅用于解码条目的名称和注释(如果此位标志未设置)。

引入的版本

.NET 9 RC 1

中断性变更的类型

此更改为行为更改

更改原因

此更改会更正 .NET 7 和 .NET 8 中的回归。 它还会返回 ZipArchive 以符合 ZIP 文件格式规范第 4.4.4 节和附录 D 的要求。

如果代码将编码传递给 ZipArchive 构造函数,请注意,在所有情况下都不遵循此编码。 仅当未设置条目的 UTF8 位时,才会使用它。

如果使用 ZipArchive 解析名称以非 UTF8 格式编码(但设置了 UTF8 位标志)的 ZIP 条目,则再也无法这样做。 之前的行为是一个 bug。

受影响的 API