Deutsche Buchstaben und Kodierung in C #

8

Ich habe eine Entpackfunktion, und ich verwende System.Text.Encoding , um sicherzustellen, dass die extrahierten Dateien nach der Extraktion die gleichen Namen behalten, weil die entpackten Dateien in der Regel deutsche Buchstaben enthalten.
Ich habe versucht verschiedene Dinge wie Encoding.Default oder Encoding.UTF8 , aber nichts funktioniert äÄéöÖüß.txt wird in „Ž‚”™á.txt konvertiert oder im Falle von Standard sind es schwarze Felder: /

irgendwelche Vorschläge?

%Vor%     
eMizo 15.11.2013, 09:10
quelle

2 Antworten

6

Versuchen Sie CodePage 850 (hat für mich gearbeitet):

%Vor%

Der nächste Kommentar stammt von (einer alten Version) von Sharpziplib, der mich in die richtige Richtung gebracht hat:

%Vor%

Die letzte Zeile ist meine Änderung, um zip-Dateien mit Sonderzeichen korrekt lesen zu können.

    
GvS 15.11.2013, 09:26
quelle
10

Zuallererst erlaubt das einzige offizielle (nicht existierende ...) ZIP-Format keine Unicode-Zeichen (dann können Sie keine andere Codierung als ASCII verwenden).

Das heißt, viele Werkzeuge und Bibliotheken erlauben es Ihnen, verschiedene Kodierungen zu verwenden, aber es kann scheitern (zum Beispiel wenn Sie versuchen, forcing UTF8 / UTF32 oder was auch immer eine Datei mit einer anderen Kodierung kodiert) zu dekodieren.

Wenn der Dateiname in ASCII codiert ist, wird die Codepage Ihres Systems angezeigt:

  

Für Eintragsnamen, die nur ASCII-Zeichen enthalten, wird das Sprachencodierungs-Flag gesetzt, und die aktuelle Systemstandard-Codepage wird zum Codieren der Eintragsnamen verwendet.

Sie haben keine so große Kontrolle mit .NET-Klassen zu diesem Thema. Wenn Sie jedoch keine Kodierung 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 einfach (weil uns ein Standard fehlt), aber zusammenzufassen:

  • Kodierung nicht erzwingen (es sei denn, Sie zippen Datei, die Sie dann mit einer bekannten Kodierung gezippt haben).
  • Das Standardverhalten ist in den meisten Fällen ziemlich gut.
  • Bei ASCII-codierten ZIP-Dateien mit erweiterten Zeichen wird die Systemcodepage verwendet (sie muss in beiden Systemen identisch sein).
  • Geben Sie dem Benutzer die Möglichkeit, die Kodierung zu ändern (Sie können nicht überprüfen, welche Kodierung das Zip-Dienstprogramm verwendet, und es gibt keinen Standard dafür). 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 Recht Encoder für die von Ihnen angegebene Codepage).

Der beste Tipp, den ich Ihnen geben kann? 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. Besonders erzwinge es nicht aus dem Code mit der deutschen spezifischen Codepage, weil es mit der ersten spanischen / französischen / italienischen / niederländischen Datei, die du handhabt, bricht (und es gibt keine gemeinsame Codepage für sie) .

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

Bearbeitung für zukünftige Leser (aus Kommentaren): CP 850 fängt die meisten westeuropäischen Charaktere ein, aber es ist nicht Die Code-Seite 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 das 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 den CP 850 verwenden, erhalten Sie ì statt ı , weil er im ursprünglichen CP 850 Code 213 hat. Ich werde nicht einmal Fernost-Sprachen erwähnen ( weil eine feste Codepage selbst dann, wenn Sie auf Europa beschränkt sind, unordentlich wird. Aus diesem Grund können Sie keine feste Codepage festlegen, es sei denn, Sie schreiben ein kleines Dienstprogramm für Ihren eigenen Gebrauch.

    
Adriano Repetti 15.11.2013 09:20
quelle

Tags und Links