2014-05-21 20 views
9

Ich möchte eine Datei unter Windows (7) mit ZipOutputStream zippen. Das Problem ist, dass der Dateiname (und auch der Inhalt der Datei) auch griechische Zeichen enthält ("ГП0000660040140521_a.txt", Gamma und Pi). Der Code zip Datei Ich verwende:"IllegalArgumentException: UNMAPPABLE [1]" beim Zippen einer Datei mit griechischen Zeichen

ZipOutputStream zipOs = new ZipOutputStream(
    new FileOutputStream("c:\\temp\\test.zip"), Charset.forName("cp737") 
); 

File sourceFile = new File("C:/Path/To/File/ГП0000660040140521_b.txt"); 
String entryName = sourceFile.getName().replaceAll("\\\\", "/"); 
ZipEntry entry = new ZipEntry(entryName); 
zipOs.putNextEntry(entry); 
... 
... 

Aber in der letzten Zeile (der putNextEntry Anruf) bekomme ich ein IllegalArgumentException:

java.lang.IllegalArgumentException: UNMAPPABLE[1] 
at java.util.zip.ZipCoder.getBytes(ZipCoder.java:95) 
at java.util.zip.ZipOutputStream.writeLOC(ZipOutputStream.java:407) 
at java.util.zip.ZipOutputStream.putNextEntry(ZipOutputStream.java:221) 

ich dort übernehmen muss etwas falsch mit der Zeichenzuordnung sein zwischen Griechisch und UTF-8 ... Was ist der richtige Weg, um eine Datei mit griechischen Zeichen im Dateinamen zu komprimieren?

EDIT

Wenn ich „utf-8“ als Zeichen der Zip-Datei erstellt werden kann, festgelegt, aber der Name der Zip-Datei ist falsch: „ðôðƒ0000660040140521_a.txt“ (die griechischen Buchstaben fehlen)

+0

Was macht die createZipEntry-Methode? – agad

+0

@agad: Mein Fehler! Ich habe den Code korrigiert. Vielen Dank. – Steffen

+0

Wenn Sie sagen, der Name ist "falsch", wie genau verifizieren Sie das? Welches Tool verwenden Sie, um die ZIP-Datei zu untersuchen, und sind Sie sicher, dass dieses Tool die gleiche Codierung verwendet, um die Dateinamen so zu interpretieren, wie Sie sie beim Erstellen verwendet haben? –

Antwort

0

Ich schrieb diese (späte) Antwort wegen der Kommentare von "Miso" und "Kriegax" meiner Frage.

Wenn ich mich richtig erinnere, habe ich irgendwo gelesen, dass die UTF8-Unterstützung von Dateinamen in ZIP-Dateien eine der großen Schwachstellen von ZIP-Dateien ist (weil UTF-8 nicht offiziell von ZIP-Standard unterstützt wird?!?). Möglicherweise sind es jetzt vorhandene Zip-Anwendungen, die UTF-8 in Dateinamen unterstützen.

Jedoch. In unserem Fall war es in Ordnung für uns, die griechischen Zeichen durch "normale" Zeichen ("a ... z") zu ersetzen, da die zu zipenden Dateien von einem Fiskaldrucker erzeugt wurden und das in jedem Fall nur ein griechisches Zeichen enthält : ein "PI" (nur ein Workaround ...).

+0

Das eigentliche Problem mit ZIP ist, dass es keine Meta-Informationen über die tatsächliche Codierung (Zeichensatz) enthält, die zum Verschlüsseln der Dateinamen verwendet wird. – miso

0

Seit ZipCoder verwendet von ZipOutputStream einen Mapper verwendet konfiguriert ist, um immer eine Ausnahme auslösen, wenn das Zeichen nicht zugeordnet werden kann, endete ich den Eintragsnamen in den angegebenen Zeichen zuerst von mir gesetzt Umwandlung und nur dann durch ZipEntry entry = new ZipEntry(entryName) aufrufe. Sie können es zum Beispiel auf diese Weise tun:

new String(input.getBytes(charset), charset) 

Dies stellt sicher, dass alle unmpabble Zeichen Ersatzzeichen umgewandelt werden und keine Ausnahme gegeben ist.

Versuchen Sie dies und Sie werden wahrscheinlich einige Unicode-Steuerzeichen (die nicht mappbar sind) in der ursprünglichen Eingabe bemerken.

Verwandte Themen