2014-05-21 5 views
9

Я хочу сделать zip-файл в Windows (7) с помощью ZipOutputStream. Проблема заключается в том, что имя файла (и содержимое файла) тоже содержит греческие символы («ГП0000660040140521_a.txt», «Гамма» и «Пи»). Код заархивировать файл я использую:«IllegalArgumentException: UNMAPPABLE [1]» при zip-файле с греческими символами

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

Но на последней строке (putNextEntry вызова) Я получаю 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) 

Я предполагаю, что там должно быть что-то не так с отображением символов между Греческий и UTF-8 ... Каким образом можно закрепить файл с греческими символами в имени файла?

EDIT

Если я использую «UTF-8», как набор символов, почтовый файл может быть создан, но имя архивного файла является неправильным: «ðôðƒ0000660040140521_a.txt» (греческие символы отсутствует)

+0

Что делает метод createZipEntry? – agad

+0

@agad: Моя ошибка! Я исправил код. Благодарю. – Steffen

+0

Когда вы говорите, что имя «неправильно», как именно вы это проверяете? Какой инструмент вы используете для проверки ZIP-файла, и уверены ли вы, что этот инструмент использует ту же самую кодировку для интерпретации имен файлов, которые вы использовали при их создании? –

ответ

0

Я написал этот (последний) ответ из-за комментариев «miso» и «kriegax» моего вопроса.

Если я правильно помню, я где-то читал, что поддержка имен файлов в ZIP-файлах UTF8 является одной из самых слабых мест в zip-файлах (поскольку UTF-8 официально не поддерживается стандартом zip?!?). Возможно, теперь это существующие zip-приложения, которые поддерживают UTF-8 в именах файлов.

Однако. В нашем случае нам было нормально заменять греческие символы «нормальными» символами («a ... z»), потому что файлы для zip были сгенерированы фискальным принтером, и в каждом случае содержится только один греческий символ : «PI» (только обходной путь ...).

+0

Реальная проблема с ZIP заключается в том, что она не несет никакой метаинформации о фактической кодировке (кодировке), используемой для кодирования имен файлов. – miso

0

С ZipCoder используется ZipOutputStream использует картограф, выполненный с возможностью всегда сгенерирует исключение, когда персонаж не может быть отображен, я в конечном итоге преобразование entryName в указанном наборе символы первого по себе и только потом по телефону ZipEntry entry = new ZipEntry(entryName). Вы можете сделать это, например, таким образом:

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

Это гарантирует, что все unmpabble символы преобразуются в символы замены и исключения не даются.

Попробуйте это, и вы, вероятно, заметите некоторые управляющие символы Unicode (которые не отображаются) в исходном вводе.

Смежные вопросы