2013-11-15 11 views
8

Ich habe eine Entpackungsfunktion, und ich verwende System.Text.Encoding, um sicherzustellen, dass die Dateien, die extrahiert werden, behalten die gleichen Namen nach der Extraktion, weil die Dateien, die ich entpacken in der Regel deutsche Buchstaben enthält.
Ich habe versucht, verschiedene Dinge wie Encoding.Default oder Encoding.UTF8 aber nichts funktioniert äÄéöÖüß.txt zu „Ž‚”™á.txt oder im Falle des Ausfalls umgewandelt wird ist es Black Boxes:/Deutsche Buchstaben und Codierung in C#

irgendwelche Vorschläge?

using (ZipArchive archive = System.IO.Compression.ZipFile.Open(ZipFile, ZipArchiveMode.Read, System.Text.Encoding.Default)) 
{ 

    foreach (ZipArchiveEntry entry in archive.Entries) 
    { 
     string fullPath = Path.Combine(appPath, entry.FullName); 
     if (String.IsNullOrEmpty(entry.Name)) 
     { 
      Directory.CreateDirectory(fullPath); 
     } 
     else 
     { 
      if (!entry.Name.Equals("Updater.exe")) 
      { 
       entry.ExtractToFile(fullPath,true); 

      } 
     } 
    } 
} 
+0

Sie könnten auch versuchen, 'UTF32' –

+0

es gibt einen Fehler beim Ausführen" Der angegebene Eintrag Name wird nicht unterstützt " – eMizo

+0

Sind Sie sicher, dass die Dateinamen correc gespeichert sind? Welche Namen erscheinen mit anderen Unzip-Programmen? – GvS

Antwort

6

Try Codepage 850 (hat für mich gearbeitet):

using (ZipArchive archive = System.IO.Compression.ZipFile.Open(ZipFile, ZipArchiveMode.Read, System.Text.Encoding.GetEncoding(850))) 
{ 
     // .... 

Der nächste Kommentar von (einer alten Version) ist von SharpZipLib, die mich in die richtige Richtung gestellt:

/* Using the codepage 1252 doesn't solve the 8bit ASCII problem :/ 
     any help would be appreciated. 

     // get encoding for latin characters (like ö, ü, ß or ô) 
     static Encoding ecp1252 = Encoding.GetEncoding(1252); 
    */ 

    // private static Encoding _encoding = System.Text.ASCIIEncoding; 
    private static Encoding _encoding = System.Text.Encoding.GetEncoding(850); 

Die letzte line ist meine änderung, damit es zip-files mit speziellen zeichen korrekt liest.

+1

850 funktionierte auch für mich, danke !! :) – eMizo

+1

Nur ein paar Anmerkungen: Seite 850 und 1252 sind etwas völlig anderes (und absolut nicht austauschbar). Durch das Erzwingen der Codepage wird die Kompatibilität mit vorhandenen ZIP-Dateien (Gott weiß in welchem ​​Land) und sogar mit vollkommen gültigen ZIP-Dateien (die mit der Codepage _default_ 437 erstellt wurden) aufgehoben. Dies kann ihm dabei helfen ** Dateien zu öffnen, die auf seinem Rechner und mit einem speziellen Zip Utility ** erstellt wurden, aber es wird mit 99% anderer ZIPs (mit 437, 1252 oder UTF8 kodiert) scheitern. –

+0

Der 1252 wurde in der SharpZipLib erwähnt, aber nie benutzt. Ich habe 850 verwendet und habe nie Probleme beim Lesen von ZIP-Dateien aus anderen Anwendungen. Ich entfernte den Verweis auf 1252 aus dem ersten Satz meiner Antwort. – GvS

10

Zunächst wird das nur offizielle (nicht vorhandene ...) ZIP-Format nicht unterstützt Unicode-Zeichen lassen (dann können Sie keine Codierung verwenden andere als ASCII).

Das heißt viele Werkzeuge und Bibliotheken können Sie verschiedene Codierung verwenden, aber es kann (zum Beispiel, wenn Sie versuchen, zwingen UTF8/UTF32 oder was auch immer eine Datei mit einer anderen Codierung codiert zu entschlüsseln) fehlschlagen.

Wenn Dateinamen in ASCII codiert wird, wird es die Codepage des Systems erhalten:

Für Eintragsnamen, die nur ASCII-Zeichen enthalten, wird die Sprachcodierung Flag gesetzt und der aktuellen System-Standard-Code Seite wird verwendet, um die Eintragsnamen zu codieren.

Sie haben keine so große Kontrolle mit .NET-Klassen zu diesem Thema. Wenn Sie jedoch keine Codierung angeben, erhalten Sie das Standardverhalten (UTF8 für Codes außerhalb von ASCII und aktuelle Codepage für ASCII). Meistens funktioniert es (wenn sowohl die Kodierung als auch die Dekodierung innerhalb derselben Codepage erfolgt ist).

Wie vermeide ich das? Es ist nicht leicht (weil wir von einem Standard fehlen), aber zusammenfassen:

  • nicht mit Gewalt Codierung (es sei denn, Sie ZIP-Datei sind raubend gezippt Sie dann mit einer bekannten Codierung).
  • Das Standardverhalten ist in den meisten Fällen ziemlich gut.
  • Für ASCII-kodierte ZIPs mit erweiterten Zeichen verlassen Sie sich auf System-Code-Seite (es muss in beiden Systemen identisch sein).
  • Stellen Sie dem Benutzer eine Möglichkeit zur Verfügung, die Codierung zu ändern (Sie können nicht überprüfen, welche Kodierung von Zip-Dienstprogramm verwendet wird, und es gibt keinen Standard darüber). Es bedeutet nicht nur die Kodierung zu ändern (UTF8/UTF16 oder was auch immer), sondern auch die Codepage (falls sie nicht übereinstimmen). GetEncoding Funktion gibt Ihnen richtigen Encoder für die von Ihnen angegebene Codepage).

Besten Hinweis kann ich Ihnen geben? Verlassen Sie sich auf Standardverhalten (es ist ziemlich üblich), aber bieten Sie eine Möglichkeit für Ihre Benutzer, es zu ändern, wenn Sie mit den meisten ZIPs da draußen kompatibel sein müssen (da jeder auf eine andere Weise implementiert werden kann), nicht nur für die Codierung sondern für Codepage auch. Vor allem erzwingen Sie es nicht von Code mit deutscher spezifischer Codepage, weil es mit der ersten spanischen/französischen/italienischen/holländischen Datei bricht, die Sie behandeln (und es gibt keine gemeinsame Codepage für sie).

BTW bereit sein, verschiedene Ausnahmen zu behandeln, wenn Sie eine Datei mit falscher Codierung (nicht Codepage) öffnen.

Bearbeitung für zukünftige Leser (aus den Kommentaren): CP 850 Fänge die meisten gemeinsamen Zeichen Westeuropa, aber es ist nicht die Codepage für Europa. Vergleichen Sie es zum Beispiel mit osteuropäischen Sprachen oder mit Norwegisch. Es passt nicht zu ihnen (und in diesen Sprachen sind Zeichen außerhalb des Bereichs 33-127 ziemlich häufig, weil sie keine Box-Zeichnung sind). Einige Zeichen aus CP 850 (ÊËı zum Beispiel) sind in (sagen wir mal) CP 865 (für Norsk Sprache) nicht verfügbar.

Lassen Sie mich mit einem Beispiel erklären. Sie haben einen Dateinamen (von Trukey) mit diesem Namen: "Garip Dosya Adı.txt". Das letzte Zeichen hat den Code 141 auf CP 857 (für die Türkei). Wenn Sie CP 850 verwenden, erhalten Sie ì anstelle von ı weil in der ursprünglichen CP 850 Code 213. Ich werde nicht einmal Fernost Sprachen erwähnen (weil eine feste Code-Seite wird auch ein chaotisch machen wenn du auf Europa beschränkt bist). Aus diesem Grund können Sie keine feste Codepage festlegen, es sei denn, Sie schreiben ein kleines Dienstprogramm für Ihren eigenen Gebrauch.

+0

Danke für deine Erklärung :) wirklich nützlich vor allem, dass ich so wenig Wissen über dieses Thema habe :) Danke nochmal! – eMizo

+0

Eine letzte Frage, in meinem Fall funktionierte die Codepage 850, aber der Standard gab mir in meinem Fall nicht die Lösung, wäre es so schlecht, auf dem 850 zu bleiben? – eMizo

+1

@eMizo natürlich ** es ist wirklich schlecht ** (es sei denn, Sie schreiben ein ** kleines Dienstprogramm für Ihren persönlichen Gebrauch **). Seite 850 enthält die meisten _common_ Zeichen, die in westlichen Sprachen verwendet werden, ** aber es ist nicht die _default_ 437 DOS-Codepage ** (die theoretisch dem ZIP-Format entspricht). Es bedeutet, dass Sie die meisten Dateien mit deutschen Zeichen öffnen können, aber ** es wird mit vollkommen gültigen ZIP-Dateien fehlschlagen ** und es ist eine ganz andere Sache mit der Windows 1252-Codepage ** (viele häufig verwendete Zeichen verwenden keine t passen). –