2014-05-21 17 views
9

Desidero comprimere un file su Windows (7) con ZipOutputStream. Il problema è che il nome del file (e anche il contenuto del file file) contiene anche caratteri greci ("ГП0000660040140521_a.txt", Gamma e Pi). Il codice per comprimere il file che uso:"IllegalArgumentException: UNMAPPABLE [1]" durante la compressione di un file con caratteri greci

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); 
... 
... 

Ma l'ultima riga (la putNextEntry chiamata) ottengo un 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) 

presumo ci deve essere qualcosa di sbagliato con la mappatura carattere tra Greco e UTF-8 ... Qual'è il modo giusto per comprimere un file con caratteri greci nel nome del file?

EDIT

Se uso "utf-8" come set di caratteri il file zip può essere creato, ma il nome del file zippato è sbagliato: "ðôðƒ0000660040140521_a.txt" (i caratteri greci mancano)

+0

Cosa fa il metodo createZipEntry? – agad

+0

@agad: Il mio errore! Ho corretto il codice. Grazie. – Steffen

+0

Quando dici che il nome è "sbagliato", come lo stai verificando esattamente? Quale strumento stai usando per ispezionare il file ZIP e sei sicuro che quello strumento stia usando la stessa codifica per interpretare i nomi dei file come li hai usati quando li hai creati? –

risposta

0

Ho scritto questa (in ritardo) risposta a causa dei commenti di "miso" e "kriegax" della mia domanda.

Se ricordo bene ho letto da qualche parte che il supporto UTF8 dei nomi file nei file zip è uno dei grandi punti deboli dei file zip (perché UTF-8 non è supportato ufficialmente dallo standard zip?!?). Possono essere ora le applicazioni zip esistenti che supportano UTF-8 nei nomi dei file.

Tuttavia. Nel nostro caso è stato ok per noi sostituire i caratteri greci con caratteri "normali" ("a ... z"), perché i file da comprimere sono stati generati da una stampante fiscale e in ogni caso contiene solo un carattere greco : un "PI" (solo una soluzione ...).

+0

Il vero problema con ZIP è che non contiene alcuna meta informazione sulla codifica effettiva (charset) usata per codificare i nomi dei file. – miso

0

Dal ZipCoder usata da ZipOutputStream utilizza un mapper configurato per lanciare sempre un'eccezione ogni volta che il personaggio non può essere mappato, ho finito per la conversione del entryname per il carattere specificato set prima da solo e poi semplicemente chiamando ZipEntry entry = new ZipEntry(entryName). Si può fare, ad esempio in questo modo:

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

Ciò garantisce che tutti i caratteri unmpabble vengono convertiti in caratteri di sostituzione ed è dato non fa eccezione.

Provate questo e probabilmente noterete alcuni caratteri di controllo Unicode (che non sono modificabili) nell'input originale.