Вопрос по java, character-encoding, zipinputstream – ZipInputStream (InputStream, Charset) декодирует имя файла ZipEntry ложно

5

Java 7 должна решить старую проблему с распаковкой zip-архивов с наборами символов, отличными от UTF-8. Это может быть достигнуто с помощью конструктораZipInputStream(InputStream, Charset), Все идет нормально. Я могу распаковать zip-архив, содержащий имена файлов с умлаутами в них при явной установке набора символов ISO-8859-1.

But вот проблема: при переборе потока черезZipInputStream.getNextEntry(), записи имеют неправильные специальные символы в своих именах. В моем случае, умляут & # xFC; & quot; заменяется на «?» характер, который, очевидно, неправильно. Кто-нибудь знает, как это исправить? очевидноZipEntry игнорируетCharset его лежащего в основеZipInputStream, Это выглядит как еще одна ошибка JDK, связанная с zip, но я тоже могу делать что-то не так.

...
zipStream = new ZipInputStream(
    new BufferedInputStream(new FileInputStream(archiveFile), BUFFER_SIZE),
    Charset.forName("ISO-8859-1")
);
while ((zipEntry = zipStream.getNextEntry()) != null) {
    // wrong name here, something like "M?nchen" instead of "München"
    System.out.println(zipEntry.getName());
    ...
}
Каковы лучшие практики для Java SE6? (помимо обновления до SE7 :) basZero
@basZero: Apache Commons Compress работает хорошо. Я не нашел никакого готового решения все же. kriegaex
Для SE6: я тестировал настройку параметров виртуальной машиныzip.altEncoding или жеzip.encoding вCp437 или жеISO-8859-1, оба не помогли правильно прочитать basZero

Ваш Ответ

1   ответ
7

О боже, я играл около двух часов, но всего через пять минут после того, как я наконец разместил здесь вопрос, я наткнулся на ответ: мой zip-файл был закодирован не по ISO-8859-1, а по Cp437. Таким образом, вызов конструктора должен быть:

zipStream = new ZipInputStream(
    new BufferedInputStream(new FileInputStream(archiveFile), BUFFER_SIZE),
    Charset.forName("Cp437")
);

Теперь это работает как шарм. Извините, что беспокою вас в любом случае. Я надеюсь, что это помогает кому-то еще сталкиваются с подобными проблемами.

Я думаю, что вы можете принять этот ответ как правильный, даже если вы написали его сами, согласно этой статье:blog.stackoverflow.com/2011/07/…

Похожие вопросы