ZipArchiveEntry-Namen und Kommentare respektieren das UTF8-Flag
Eine ZipArchive kann mit einem Encoding-Parameter erstellt werden, der zum Decodieren der Namen und Kommentare von Einträgen im ZIP-Archiv verwendet wird. .NET 7 führte eine Regression ein, bei der diese Codierung standardmäßig verwendet wurde, mit einem Fallback auf die Systemstandardcodeseite (UTF8 in .NET Core), wenn keine Codierung bereitgestellt wurde. Diese Regression wird in .NET 9 korrigiert: Wenn die allgemeinen Bitflags des Eintrags angeben, dass UTF8 verwendet werden soll, wird dies beachtet. Wenn das UTF8-Bit-Flag nicht festgelegt ist, wird die vom Benutzer bereitgestellte Codierung verwendet (mit dem vorhandenen Fallback auf die Standardcodeseite des Systems, wenn keine angegeben wird.)
Vorheriges Verhalten
In .NET 7 und .NET 8, wenn ein ZipArchive
mit einem vom Benutzer angegebenen entryNameEncoding
-Parameter instanziiert wurde, wurde diese Codierung immer verwendet, wenn die Namen und Kommentare von den Einträgen im ZIP-Archiv decodiert wurden. entryNameEncoding
wurde verwendet, auch wenn der Eintrag das Bit festgelegt hatte, um zu kennzeichnen, dass der Name und der Kommentar in UTF8 codiert wurden.
Neues Verhalten
Ab .NET 9 wird das UTF8-Bit-Flag berücksichtigt, wenn der Name und der Kommentar eines ZIP-Archiveintrags decodiert werden. Der vom Benutzer bereitgestellte entryNameEncoding
-Parameter wird nur verwendet, um den Namen und den Kommentar des Eintrags zu decodieren, wenn dieses Bit-Flag nicht festgelegt ist.
Eingeführt in Version
.NET 9 RC 1
Typ des Breaking Changes
Diese Änderung ist eine Verhaltensänderung.
Grund für die Änderung
Diese Änderung korrigiert eine Regression in .NET 7 und .NET 8. Sie gibt auch ZipArchive zur Einhaltung der ZIP-Dateiformatspezifikation, Abschnitte 4.4.4 und Anhang D zurück.
Empfohlene Maßnahme
Wenn Ihr Code eine Codierung an den ZipArchive-Konstruktor übergibt, beachten Sie, dass diese Codierung in keiner der Situationen beachtet wird. Sie wird nur verwendet, wenn das UTF8-Bit des Eintrags nicht festgelegt ist.
Wenn Sie ZipArchive verwenden, um ZIP-Einträge mit Namen zu analysieren, die im Nicht-UTF8-Format codiert sind (die jedoch das UTF8-Bit-Flag festgelegt haben), können Sie dies nicht mehr tun. Das vorherige Verhalten ist auf einen Fehler zurückzuführen.
Betroffene APIs
- 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)