Chcę spakować plik w systemie Windows (7) przy pomocy ZipOutputStream
. Problem polega na tym, że nazwa pliku (oraz plik Treści też) zawiera również znaki greckie ("ГП0000660040140521_a.txt
", Gamma i Pi). Kod zip plik używać:"IllegalArgumentException: UNMAPPABLE [1]" podczas kompresowania pliku greckimi znakami
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);
...
...
Ale w ostatnim wierszu (wywołanie putNextEntry
) dostaję 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)
Przypuszczam, że musi być coś nie tak z mapowania znaków pomiędzy Grecki i UTF-8 ... Jaki jest właściwy sposób na spakowanie pliku z greckimi znakami w nazwie pliku?
EDIT
Jeśli używam „UTF-8”, jak ustawić postać pliku ZIP mogą być tworzone, ale nazwa pliku skompresowanego jest źle: „ðôðƒ0000660040140521_a.txt
” (greckie znaki brakuje)
Do czego służy metoda createZipEntry? – agad
@agad: Mój błąd! Poprawiłem kod. Dzięki. – Steffen
Kiedy mówisz, że nazwa jest "zła", jak dokładnie to weryfikujesz? Z którego narzędzia korzystasz do sprawdzania pliku ZIP i czy na pewno używasz tego samego kodowania do interpretacji nazw plików użytych podczas ich tworzenia? –