2013-03-20 6 views
7

Ho un metodo che aggiunge inputStream a zip come una voce:Come aggiungere la voce zip con utf-8 nome per zip

private void addToZip(InputStream is, String filename) throws Exception { 
    try { 
     ZipEntry zipEntry = new ZipEntry(filename); 
     zos.putNextEntry(zipEntry); 
     byte[] bytes = new byte[1024]; 
     int length; 
     while ((length = is.read(bytes)) >= 0) { 
      zos.write(bytes, 0, length); 
     } 
     zos.closeEntry(); 
    } finally { 
     IOUtils.closeQuietly(is); 
    } 
} 

Il problema si verifica quando il nome del file contiene un carattere UTF-8 come AE. .. Nel file zip verrà salvato come ????? e quando lo decomprimo in Ubuntu 12.10 sembra: N├бstroje anziché Nástroje.

Per questo esempio ho usato JDK6 ma jdk7 ora ho anche provato:

zos = new ZipOutputStream(fos, Charset.forName("UTF-8")); 

ma senza successo.

Ho anche provato Apache Commons Zip e impostato la codifica, ma anche senza successo.

Quindi, come posso aggiungere questo file con i simboli unicode nel nome file per comprimere?

+0

Ho avuto lo stesso problema qualche tempo fa. Ho usato il set di caratteri non Unicode, specifico per la lingua locale (Cp866). E ha funzionato bene. –

+0

quindi anziché Nástroje dovrei salvare la voce come Nastroje? Questa è l'ultima opzione ... come la converti? – hudi

+0

L'applicazione era destinata all'esecuzione nel sistema Windows. E ho usato la codifica 'Cp866', per supportare i caratteri russi nei nomi di file negli archivi zip e visualizzarli correttamente quando visualizzo il contenuto del file zip. E ha funzionato. Esiste un set di caratteri non unicode che supporta i simboli della lingua? Prova ad usarlo, invece di utf-8. –

risposta

3

Sembra che questa linea Ha risolto il problema:

 zos.setCreateUnicodeExtraFields(UnicodeExtraFieldPolicy.ALWAYS); 

Qualcuno mi può spiegare che cosa è questo facendo e perché funziona?

+1

I campi extra Unicode sono un'estensione del formato zip per utilizzare campi personalizzati aggiuntivi nelle intestazioni delle voci da memorizzare una versione UTF-8 del nome del file insieme alla versione di codifica locale predefinita. Gli archivi di unpacker che supportano questa estensione useranno il nome UTF-8 dai campi extra in preferenza al campo del nome standard. –

1

L'archivio zip utilizza per impostazione predefinita la tabella codici DOS (OEM) per memorizzare i nomi file. Le implementazioni Linux/unix utilizzano la codepage di sistema durante il disimballaggio. Mac OS usa utf-8 per impostazione predefinita. Quindi nel tuo caso il nome del file è memorizzato correttamente, ma Linux archiver non lo capisce.

+0

ma quando creo zip in linux (tasto destro e comprimi) crea un archivio con il nome della voce contiene ?? ma quando lo estraggo c'è il nome corretto – hudi

+0

Certo, perché usa la stessa codifica. –

+0

la mia codepage di sistema è UTF-8 e quando utilizzo l'archivio comune di apache e l'endocing impostato su utf-8, non funziona ancora – hudi

Problemi correlati