2011-01-11 2 views
4

Ich versuche, eine Datei mit der DotNetZip-Bibliothek zu entpacken.Verwenden der DotNetZip-Bibliothek Entpacken Sie die Datei mit Nicht-ASCII-Zeichen

Die Datei enthält Ordner und Dateien mit dänischen Zeichen (æøåÆØÅ).

TotalCommander, 7Zip, Windows-eigene zip alle extrahieren die Dateien korrekt, aber DotNetZip Library Mangels die dänischen Zeichen.

Ex: File_æøåÆØÅ.txt wird File_æ¢åÆ¥Å.txt

insted es ein ¢ enthält. anstelle von Ø enthält es eine ¥.

Code:

using (var zipFile = ZipFile.Read(@"File_æøåÆØÅ.zip")) 
{ 
    zipFile.ExtractAll(@"File_æøåÆØÅ", 
         ExtractExistingFileAction.OverwriteSilently); 
} 

Ich verwende die Standard-Kodierung („da-DK“ Kultur), habe ich andere versucht Kodierungen wie UTF-8 usw.

Wie kann ich entpacken eine Datei Dateinamen enthalten mit dänischen Schriftzeichen?

+0

Sharpziplib http://www.icsharpcode.net/opensource/sharpziplib/ funktioniert. –

Antwort

0

Das klingt einfach wie ein Fehler in "DotNetZip" - haben Sie versucht SharpZipLib oder ZipPackage (in der BCL)? Kodierung bezieht sich typischerweise auf die Datei Inhalt, nicht der Name; Das sollte also kein Faktor sein.

Sie sollten report this (mit einem Beispiel) an den Autor.

+0

Es funktioniert mit SharpZipLib. –

+5

Es ist kein Fehler. DotNetZip folgt der Zip-Spezifikation in Bezug auf nicht-ASCII-Zeichen in Dateinamen. Sie müssen die Überladung ZipFile.Read() verwenden, mit der Sie beim Lesen einer solchen Zip-Datei eine Codepage angeben können. In der ZIP-Spezifikation sind die unterstützten Formate IBM437 (effektiv eine Teilmenge von ASCII) und UTF8. Wenn Ihre Datei keines davon enthält, müssen Sie die Codepage explizit angeben. Es gibt keine Möglichkeit für eine Bibliothek, die richtige Seite aus der ZIP-Datei zuverlässig abzuleiten. Angenommen, es ist "die Standard-Codepage auf dem Desktop", wie dies bei anderen Bibliotheken der Fall ist, ist dies inkorrekt und riskant. – Cheeso

+0

Auch - die Handhabung von Codepages ist ausführlich in der Hilfedatei für DotNetZip dokumentiert. – Cheeso

2

Ich benutzte Filestream zum Lesen und soweit ich mich erinnere funktionierte es (DotNetZip-v1.9). Code zum Lesen:

using (FileStream fs = File.OpenRead(filePath)) 
{ 
    ZipFile zf = ZipFile.Read(fs); 
    ICollection<ZipEntry> entries = zf.Entries; 
    foreach (ZipEntry entry in entries) 
    { 
      string path = entry.FileName; // 
    } 
} 

Und für ein Zip-Archiv zu machen: ZipFile zip = new ZipFile(Encoding.UTF8);

3

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.

0

Zunächst überwiegender DotNetZip Standardcodierung

zip.AlternateEncodingUsage = ZipOption.Always; 

verwendet, ist gefährlich, weil es immer zip-Codierung überschreibt, ungeachtet dem, was tatsächlich verwendet zip. Ich habe von mir verwendet

zip.AlternateEncoding = System.Text.Encoding.UTF8; 
zip.AlternateEncodingUsage = ZipOption.AsNecessary; 

So utf-8 bei Bedarf verwenden.

Aber im Zusammenhang mit der Codepage-Diskussion - Ich habe dies in dotnetzip selbst behoben (lokale Kopie, die ich habe) und Standard-Codepage von "ibm437" in "ibm861" geändert.

Ich habe 7-Zip-und Windows-Zipping-Tool verwendet, um spezielle Art von Zip zu erstellen, und war mit Sonderzeichen 'ø' in Dateiname. Basierend auf den Testergebnissen ist die von Windows und 7-zip verwendete Standardcodierung "ibm861", nicht "ibm437", wie in den meisten Dokumentationen angegeben.

Fix kann durch Suchen nach "ibm437" string und Ersetzen von "ibm861" in dotnetzip selbst angewendet werden.

Hier ist, wo ich einige Erwähnung über Codierung Seite befinden: http://www.nudoq.org/#!/Packages/DotNetZip/Ionic.Zip/ZipInputStream/P/ProvisionalAlternateEncoding

0

ich ein Problem mit dem Entpacken hatte. In Zip-Datei sollte meine App lesen Ich habe spezielle osteuropäische Zeichen wie đđčćž. WinRAR oder 7Zip entpackt es gut, aber mit DNZ-Bibliothek (IonicZip 1.9.1.8) anstelle von š ich habe μ.

Ich habe versucht, wie 15 verschiedene Encondings, als schließlich herausgefunden, dass angegebene ZIP-Datei ist ibm852. Nun arbeitete dieses Codebeispiel für mich:

ZipFile zf = new ZipFile(path, System.Text.Encoding.GetEncoding("ibm852")); 
zf.ExtractAll(loc, ExtractExistingFileAction.OverwriteSilently); 

Einstellung wie AlternateEncoding Eigenschaft im folgenden Ausschnitt mir nicht helfen:

using (ZipFile zz = ZipFile.Read(path)) 
{ 
    zz.AlternateEncodingUsage = ZipOption.Always; 
    zz.AlternateEncoding = System.Text.Encoding.GetEncoding("ibm852"); 
    zz.ExtractAll(loc, ExtractExistingFileAction.OverwriteSilently); 
} 

Ich habe keine Zeit, warum zu untersuchen, wahrscheinlich müssen Sie Setzen Sie die Codierung beim Aufruf des Konstruktors, da ich den Codierungsparameter in der Read-Methode nicht gefunden habe.