Ich schrieb vor kurzem eine ZIP-Datei-E/A-Bibliothek namens zipzap, aber ich habe Probleme mit der Dekodierung von ZIP-Dateinamen aus beliebigen ZIP-Dateien. JetztDateinamen von ZIP-Dateien korrekt dekodieren - CP437, UTF-8 oder?
, die PKWARE spec Staaten:
D.1 Das ZIP-Format historisch nur das ursprüngliche IBM PC-Zeichen Codierung Set unterstützt hat, die allgemein als IBM-Codepage 437 ...
D.2 Wenn das allgemeine Bit 11 nicht gesetzt ist, müssen Dateiname und Kommentar der ursprünglichen ZIP-Zeichencodierung entsprechen. Wenn Allzweck-Bit 11 gesetzt ist, der Dateiname und Kommentar muss unterstützt den Unicode Standard, Version 4.1.0 oder mehr mit der Zeichencodierung Form, definiert durch die UTF-8-Speicher Spezifikation ...
die bedeutet, dass konforme ZIP-Dateien Dateinamen als CP437 kodieren, es sei denn, das EFS-Bit ist gesetzt, in diesem Fall sind die Dateinamen UTF-8.
Leider scheinen viele ZIP-Tools entweder das EFS-Bit nicht korrekt einzustellen (z. B. Mac CLI, GUI-Zip) oder eine andere Kodierung zu verwenden, normalerweise das Standardsystem (z. B. WinZip?). Wenn Sie wissen, wie WinZip-, 7-Zip-, Info-Zip-, PKZIP-, Java JAR/Zip-, .NET zip-, dotnetzip-, usw.-kodierte Dateinamen und wie sie ihr Feld "Version hergestellt von" auf zipping setzen, bitte Sag mir.
Insbesondere Info-Zip versucht dies, wenn unzipping:
- Dateisystem = MS-DOS (0) => CP437
- Ausnahme: version = 2,5, 2,6, 4,0 = > ISO 8859-1
- Dateisystem = HPFS (6) => CP437
- Dateisystem NTFS = (10) und version = 5.0 => CP437
- sonst, ISO 8859-1
Wenn ich unterstützen möchten Inspektion oder aus beliebigen ZIP-Dateien zu extrahieren und einen angemessenen Versuch der Dateinamen-Codierung ohne die EFS-Flag machen, was kann ich aussehen zum?