2012-11-07 14 views
7

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?

Antwort

2

Die einzige Möglichkeit festzustellen, ob der Dateiname ohne Verwendung des EFS-Flags als UTF-8 codiert ist, besteht darin, zu prüfen, ob das höherwertige Bit in einem der Zeichen gesetzt ist. Das könnte möglicherweise bedeuten, dass das Zeichen UTF-8 codiert ist. Es könnte jedoch auch andersherum sein, da es in CP437 einige Zeichen gibt, bei denen das höherwertige Bit gesetzt ist und die nicht als UTF-8 decodiert werden sollen.

Ich würde an der PKWARE App Note-Spezifikation bleiben und nicht in eine Lösung hacken, die versucht, mit jeder bekannten bestehenden Zip-Anwendung zu entsprechen.

2

Im Moment Situation ist wie folgt:

  • die meisten Windows-Implementierungen verwenden DOS (OEM) Codierung
  • Mac OS Zip-Programm verwendet utf-8, aber es Bit nicht gesetzt utf-8 Fahnen
  • * nichts zip Dienstprogramme leise verwendet System Codierung

So ist der einzige Weg, um zu überprüfen, wenn Dateinamen so etwas wie UTF-8-Zeichen (überprüfen Beschreibung von UTF-8-Codierung enthalten - erster Byte 110xx sein sollte xxx, Sekunde - 10xxxxxx für 2 Bytes codierte Zeichen). Wenn es richtig ist utf8 string - benutze utf8 encoding. Wenn nicht - auf OEM/DOS-Codierung zurückgreifen.