Verwenden von Unicode-Zeichen für Dateinamen in einem Zip-Archiv

7

Ich zipper einen Dateinamen enthält einige Sonderzeichen wie Péréquation LES HOPITAUX NEUFS.xls in einen anderen Ordner, sagen temp .

Ich bin in der Lage, die Datei zu komprimieren, aber das Problem ist der Name der Datei ändert sich automatisch zu P + ¬r + ¬quation LES HOPITAUX NEUFS.xls .

Wie kann ich Unicode-Zeichen für Dateinamen in einem Zip-Archiv unterstützen?

    
Maddy 02.04.2012, 10:31
quelle

2 Antworten

16

Es hängt ein wenig davon ab, welchen Code Sie zum Erstellen des Archivs verwenden. Die alten Java-Komprimierungsklassen sind nicht so flexibel, wie Sie benötigen.

Sie können die Apache Commons-Komprimierung verwenden. Michael Simons hat das geschrieben Stück Code:

%Vor%

Wenn Sie Java 7 verwenden , haben Sie endlich einen Charset -Parameter (der UTF-8 sein kann) auf ZipOutputStream -Konstruktor

Das große Problem ist, dass viele Implementierungen die Unicode-Codierung nicht verstehen, weil das ursprüngliche ZIP-Dateiformat ASCII ist und es keinen offiziellen Standard für Unicode gibt. Weitere Informationen finden Sie in diesem Beitrag .

>     
Adriano Repetti 02.04.2012, 10:45
quelle
6

In der Zip-Spezifikation (historisch) wird nicht angegeben, welche Zeichencodierung für die eingebetteten Dateinamen und Kommentare verwendet werden soll. Der ursprüngliche IBM PC-Zeichencodierungssatz, der üblicherweise als IBM Codepage 437 bezeichnet wird, soll die einzige Codierung sein unterstützt. Die Jar-Spezifikation spezifiziert mittlerweile ausdrücklich, UTF-8 als Kodierung zu verwenden, um alle Dateinamen und Kommentare in Jar-Dateien zu kodieren und zu dekodieren. Unsere Implementierung von java.util.jar und java.util.zip folgte daher genau der Jar-Spezifikation, um UTF-8 als einzige Kodierung zu verwenden, wenn es um Dateinamen und Kommentare in Jar / Zip-Dateien geht.

Folge? Die ZIP-Datei, die mit dem "traditionellen" ZIP-Werkzeug erstellt wurde, ist für java.util.jar / zip-basierte Werkzeuge nicht zugänglich, und umgekehrt, wenn der Dateiname Zeichen enthält, die zwischen Cp437 nicht kompatibel sind (als Alternative können Werkzeuge einfach den Standard-Plattformcodierung) und UTF-8

Für die meisten Europäer sind Sie "glücklich" :-) dass Sie nur eine Handvoll Zeichen vermeiden müssen, wie die Umlaute (OK, ich mache nur Spaß), aber für Japanisch und Chinesisch am meisten der Charaktere sind einfach kein Glück. Aus diesem Grund war der Bug 4244499 schon so lange die Nr.1 ​​unter den Top 25 Java Bugs. Der Bug ist nicht mehr auf der Liste :-) Es wurde endlich in OpenJDK 7, b57 "behoben". Ich mache immer noch einen Schnappschuss als Aufnahme / Kudo für mich selbst: -)

Die Lösung (ich würde "Lösung" als "fix" verwenden) in JDK7 b57 ist die Einführung in einen neuen Satz von ZipInputStream ZipOutStream und ZipFile Konstruktoren mit einem bestimmten "charset" als Parameter, wie unten gezeigt.

ZipFile (Datei, Zeichensatz)

ZipInputStream (InputStream, Zeichensatz)

ZipOutputStream (OutputStream, Zeichensatz)

Mit diesen neuen Konstruktoren können Anwendungen nun über ZipInputStream oder ZipFile-Objekte, die mit der spezifischen Kodierung erstellt wurden, auf diese Nicht-UTF-8 ZIP-Dateien zugreifen oder über den neuen ZipOutputStream Zip-Dateien in nicht-UTF-8 kodieren Zeichensatz), falls erforderlich.

zip ist eine abgespeckte Version des Jar-Tools mit einer "-encoding" -Option zur Unterstützung der Nicht-UTF8-Codierung für den Eintragsnamen und -kommentar. Es kann als Demo für die Verwendung der neuen APIs dienen (ich habe es verwendet) als Einheitstest). Ich diskutiere immer noch mit mir selbst, ob es eine gute Idee ist, "-encoding" offiziell in das Jar-Tool einzuführen ...

    
dhams 02.04.2012 11:33
quelle

Tags und Links