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.
Sie könnten auch versuchen, 'UTF32' –
es gibt einen Fehler beim Ausführen" Der angegebene Eintrag Name wird nicht unterstützt " – eMizo
Sind Sie sicher, dass die Dateinamen correc gespeichert sind? Welche Namen erscheinen mit anderen Unzip-Programmen? – GvS