Имена файлов с японскими символами превращаются в мусор при записи в zip-файл с помощью java.util.zip.*

У меня есть каталог с именем, содержащим японские символы, и мне нужно использовать утилиты zip в java.util.zip, чтобы записать его в zip-файл. Запись zip-файла прошла успешно, но когда я открываю полученный zip-файл либо с помощью встроенной в Windows утилиты сжатия файлов, либо с помощью 7-Zip, каталог с японскими символами в имени отображается как набор символов мусора. В моей системе установлен языковой пакет для японского/восточноазиатского языка — я могу создавать каталоги с японскими именами, так что это не проблема.

Интересно, что если я напишу отдельный скрипт для чтения полученного zip-файла с помощью java.util.zip, имя каталога будет правильным, и я смогу извлечь содержимое zip-архива в каталоги с соответствующими именами и японскими символами. Но я не могу сделать это, используя коммерческие zip-инструменты, которые я пробовал, что, несомненно, захотят сделать наши клиенты.

Любые идеи о том, что вызывает эту проблему, и как я могу ее обойти?

Я знаю об этой ошибке, но мне все еще нужен обходной путь для этого случая.


person Jeff    schedule 30.12.2009    source источник
comment
Хороший вопрос. Если вы можете извлечь его с помощью своего скрипта и получить правильные имена файлов в конце, это означает, что символы закодированы в кодировке, которая поддерживает эти символы, например Shift-JIS или UTF-8.   -  person Craig McQueen    schedule 30.12.2009
comment
Это определенно UTF-8 или его версия для Java. См. эту ссылку: velocityreviews.com/ форумы/   -  person Jeff    schedule 30.12.2009


Ответы (3)


Если java.util.zip по-прежнему ведет себя как этот пост описывает, я не уверен, что это возможно (со встроенными классами). Я видел библиотеку Chilkat Java Zip, упомянутую ранее, как способ получить это работает, но никогда не использовал его.

person Kaleb Brasee    schedule 30.12.2009
comment
просто добавить ... в сообщении говорится, что формат ZIP-файла не поддерживает Unicode. Имена файлов представляют собой всего лишь 8-битные строки внутри, с (на самом деле) без определенной кодировки или кодировки Unicode. Это означает, что автор и читатель файла должны договориться о взаимно понятном формате. Это никогда не было полностью правдой. На момент написания этого поста в 2005 году кодировка была IBM437. Не было соглашения о символах, которые требовали чего-то вне этой кодировки. В 2007 году PKZIP добавил в спецификацию UTF-8. Как говорит Калеб, неясно, развивалась ли когда-либо J2SE для поддержки этого обновления спецификации. Думаю, нет. - person Cheeso; 03.01.2010
comment
Я пробовал использовать библиотеки Chilkat, но результаты были хуже, чем при использовании стандартной утилиты zip. - person ThomasW; 17.10.2011

TrueZIP утверждает, что делает это лучше:

J2SE API всегда использует UTF-8 (восьмибитный набор символов Unicode) для имен записей и комментариев вместо CP437 (он же IBM437, подлинный набор символов IBM-PC), который используется фактическим стандартом PKZIP от PKWARE. В результате вы не можете читать или записывать ZIP-файлы с международными именами файлов, такими как, например. täscht.txt в ZIP-файле, созданном (южным) немцем.

[описание других проблем опущено]

Библиотека TrueZIP была разработана для преодоления этих ограничений/недостатков.

person meriton    schedule 30.12.2009
comment
Я не знаю о библиотеке TrueZIP, но комментарий немного вводит в заблуждение. Создатели де-факто стандартного программного обеспечения PKZIP, PKWARE, публикуют актуальную спецификацию формата. pkware.com/support/zip-application-note Спецификация позволяет использовать либо CP437, либо UTF-8. Если приложения ZIP соответствуют спецификации, они могут использовать любую кодировку. Таким образом, утверждение, что вы не можете читать или записывать ZIP-файлы с именами записей, преобразованными в i18n, в общем случае неверно. Любое приложение может соответствовать спецификации. - person Cheeso; 03.01.2010
comment
При этом некоторые приложения и инструменты zip не полностью соответствуют спецификации, в частности часть спецификации UTF-8, которая была впервые добавлена ​​в сентябре 2007 года. Так, например, сжатые папки Windows Vista не будут правильно читаться. ZIP-файлы с именами записей в кодировке UTF-8. Не уверен насчет встроенных в Mac zip-инструментов. Я также не уверен, что J2SE API соответствует редакции спецификации zip от сентября 2007 года. Возможно, несмотря на поддержку UTF-8 в спецификации, API J2SE предшествует спецификации и делает что-то вне спецификации для поддержки Unicode. - person Cheeso; 03.01.2010
comment
Очень информативно. ИМХО, это потребовало бы отдельного ответа (и голоса). Я думаю, что южногерманская часть — это просто легкомысленная мотивация имени записи, содержащего не-ascii-символ ä. - person meriton; 04.01.2010
comment
Рада, что информативно. Я сделал это комментарием, потому что у меня нет хороших идей о том, как решить проблему в Java. Так что твой ответ все равно лучший! - person Cheeso; 05.01.2010

Чудеса действительно случаются, и Sun/Oracle действительно исправили долгоживущий баг/rfe:

Теперь можно [настроить кодировку имени файла при создании][1] zip-файла/потока (требуется Java 7).

[1]: http://download.java.net/jdk7/docs/api/java/util/zip/ZipOutputStream.html#ZipOutputStream(java.io.OutputStream, java.nio.charset.Charset)

person Anton Kraievyi    schedule 28.07.2010
comment
Вау, это отличная новость. Пройдет некоторое время, прежде чем наши клиенты смогут извлечь из этого пользу, но я рад, что это не осталось просто гнойной язвой. - person Jeff; 29.07.2010