Os nomes e comentários de ZipArchiveEntry respeitam o sinalizador UTF8
O ZipArchive pode ser criado com um parâmetro Encoding, que é usado para decodificar os nomes e comentários das entradas no arquivo ZIP. O .NET 7 introduziu uma regressão em que essa codificação foi usada por padrão, com um fallback para a página de código padrão do sistema (UTF8 no .NET Core) se nenhuma codificação fosse fornecida. Essa regressão é corrigida no .NET 9: se os sinalizadores de bit de uso geral da entrada indicarem que o UTF8 deve ser usado, isso será respeitado. Se o sinalizador de bits UTF8 não estiver definido, a codificação fornecida pelo usuário será usada (com o fallback existente para a página de código padrão do sistema, se nenhuma for fornecida).
Comportamento anterior
No .NET 7 e no .NET 8, se o ZipArchive
fosse instanciado com um parâmetro entryNameEncoding
especificado pelo usuário, essa codificação sempre era usada ao decodificar os nomes e comentários das entradas no arquivo ZIP. entryNameEncoding
foi usado mesmo que a entrada tivesse o bit definido para significar que seu nome e comentário foram codificados em UTF8.
Novo comportamento
A partir do .NET 9, quando o nome e o comentário de uma entrada de arquivo ZIP são decodificados, seu sinalizador de bits UTF8 é respeitado. O parâmetro entryNameEncoding
fornecido pelo usuário só é usado para decodificar o nome e o comentário da entrada se esse sinalizador de bit não estiver definido.
Versão introduzida
.NET 9 RC 1
Tipo de alteração interruptiva
Esta é uma alteração comportamental.
Motivo da alteração
Essa alteração corrige uma regressão no .NET 7 e no .NET 8. Ele também retorna ZipArchive à conformidade com a especificação de formato de arquivo ZIP, seções 4.4.4 e apêndice D.
Ação recomendada
Se o código passar uma codificação para o construtor ZipArchive, lembre-se de que essa codificação não é respeitada em todas as situações. Ele só será usado se o bit UTF8 da entrada não estiver definido.
Se você estiver usando ZipArchive para analisar entradas ZIP com nomes codificados no formato não UTF8 (mas que têm o sinalizador de bits UTF8 definido), você não poderá mais fazer isso. O comportamento anterior era um bug.
APIs afetadas
- 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)