diese Zip-Datei zu verarbeiten, geben Sie explizit die Seite dänischen Code, wenn Sie die Zip-Lesen:
var encoding = System.Text.Encoding.GetEncoding("da-DK");
using (var zipFile = ZipFile.Read(@"File_æøåÆØÅ.zip", encoding)) {
zipFile.ExtractAll(@"File_æøåÆØÅ",
ExtractExistingFileAction.OverwriteSilently);
}
Der Grund, warum Sie müssen Sie dies explizit tun:
Die Zip-Spezifikation ermöglicht zwei Text-Kodierungen für Dateinamen und Kommentare innerhalb einer Zip-Datei: IBM437 und UTF8. Wenn eine dieser kompatiblen Codierungen verwendet wird, wird dies in den Metadaten der zip-Datei explizit angegeben. DotNetZip oder eine beliebige Bibliothek kann die Kodierung, die in der Zip-Datei angegeben ist, getrost verwenden.
Es gibt keine Möglichkeit für eine Zip-Datei, eine Codierung anzugeben, die nicht zu diesen beiden gehört. Die Zip-Spezifikation bietet keine Möglichkeit, dies zu tun. Einige Zip-Bibliotheken oder Tools erstellen Zip-Dateien, die in dieser Hinsicht nicht den Spezifikationen entsprechen. Die ZIP-Dateien verwenden Textkodierungen wie "da-DK" oder CP950 oder was auch immer. Streng genommen sind sie nicht konform mit den Spezifikationen, aber die Werkzeuge konstruieren sie immer noch. Zip-Dateien wie diese sind nicht ungewöhnlich.
In einigen Fällen schätzen einige Bibliotheken oder Tools, dass die in der ZIP-Datei verwendete Codierung mit der Standardcodierung auf dem Computer übereinstimmt. Dies ist nicht sicher oder funktioniert garantiert nicht, aber es ist eine Annahme, die im kleinen Fall funktioniert - wo die ZIP-Datei von einer nicht kompatiblen Bibliothek oder einem Werkzeug auf dem lokalen Rechner erstellt wurde. Wenn Sie eine ZIP-Datei mit der standardmäßigen (nicht kompatiblen) Textcodierung erstellen und diese dann von Stokholm nach Shanghai senden, schlägt die Verwendung der Strategie "Nehmen Sie die Standardcodierung an" zum Zeitpunkt des Lesens fehl.
DotNetZip macht die Annahme nicht. In Fällen, in denen die ZIP-Datei eine nicht konforme Textkodierung verwendet, gibt es in der ZIP-Datei keinen Hinweis darauf, welche Kodierung verwendet wird. Daher verwendet DotNetZip die Standardkodierung - IBM437 -, um die Datei zu lesen. Es gibt keine Möglichkeit für DNZ zu wissen, dass dies "falsch" ist. Wenn Sie dieses Verhalten überschreiben möchten, müssen Sie die ZipFile.Read() -Methode verwenden, die eine andere Codierung akzeptiert.
Dies ist alles in der DotNetZip documentation, speziell in der ZipFile.ProvisionalAlternateEncoding Eigenschaft beschrieben.
Sharpziplib http://www.icsharpcode.net/opensource/sharpziplib/ funktioniert. –