"IllegalArgumentException: UNMAPPABLE [1]" beim Zippen einer Datei mit griechischen Zeichen

9

Ich möchte eine Datei unter Windows (7) mit ZipOutputStream zippen. Das Problem ist, dass der Dateiname (und auch der Dateiinhalt) auch griechische Zeichen enthält (" ГП0000660040140521_a.txt ", Gamma und Pi). Der Code zum Zippen der Datei, die ich verwende:

%Vor%

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

%Vor%

Ich nehme an, dass irgendetwas mit der Zeichenzuordnung zwischen Griechisch und UTF-8 falsch sein muss ... Was ist der richtige Weg, um eine Datei mit griechischen Zeichen im Dateinamen zu komprimieren?

BEARBEITEN

Wenn ich "utf-8" als Zeichensatz verwende, kann die Zip-Datei erstellt werden, aber der Name der gezippten Datei ist falsch: " ðôðƒ0000660040140521_a.txt " (die griechischen Zeichen fehlen)

    
Steffen 21.05.2014, 12:51
quelle

3 Antworten

0

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

Wenn ich mich recht 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 vom 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 für uns in Ordnung, 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 ...).

    
Steffen 27.02.2017 07:07
quelle
0

Das Problem ist, dass CP-737 tatsächlich eine Codepage ist, die griechische Zeichen enthält. In Java NIO lautet der Name des Zeichensatzes jedoch x-IBM737 . Vgl. Ссылка

    
D. Kovács 03.03.2017 12:39
quelle
0

Da ZipCoder verwendet von ZipOutputStream einen Mapper verwendet, der so konfiguriert ist, dass immer eine Ausnahme ausgelöst wird, wenn das Zeichen nicht zugeordnet werden kann, konvertierte ich den entryName zuerst selbst in den angegebenen Zeichensatz und dann durch Aufruf von ZipEntry entry = new ZipEntry(entryName) . Sie können es zum Beispiel so machen:

%Vor%

Dies stellt sicher, dass alle nicht mischbaren Zeichen in 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.

    
miso 03.03.2017 13:36
quelle