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
- ZipArchive(Stream, ZipArchiveMode, Boolean, Encoding)
- System.IO.Compression.ZipFile.ExtractToDirectory(Stream, String, Encoding, Boolean)
- System.IO.Compression.ZipFile.ExtractToDirectory(String, String, Encoding, Boolean)
- System.IO.Compression.ZipFile.ExtractToDirectory(String, String, Encoding)
- System.IO.Compression.ZipFile.ExtractToDirectory(Stream, String, Encoding)
- System.IO.Compression.ZipFile.Open(String, ZipArchiveMode, Encoding)