Разархивировать файлы, созданные с помощью WinZIP с именами файлов I18N? - PullRequest
4 голосов
/ 02 декабря 2009

В наши дни люди создают свои ZIP-архивы с WinZIP, который допускает интернационализированные (например, нелатинские: кириллицу, греческий, китайский, вы называете это) имена файлов.

К сожалению, попытка распаковать такой файл вызывает проблемы: UNIX unzip создает файлы с именами мусора и директории, такие как «® £ ¤ © ¤ ¥ èì». В таких архивах Java и ее команда jar терпят неудачу.

Есть ли приемлемый способ распаковать такие файлы программно? UNIX или Java.

Ответы [ 2 ]

3 голосов
/ 06 декабря 2009

DotNetZip поддерживает юникод и произвольные кодировки для имен файлов в zip-файлах, для чтения или записи zip-файлов.

Это библиотека .NET. Для использования Unix вам понадобится Mono в качестве предварительного условия.

Если zip-файл правильно создан WinZip, другими словами, если он совместим с спецификацией zip от PKWare , то вам не нужно выполнять какую-либо специальную работу для определения кодировки во время распаковки , В соответствии со спецификацией zip для имен файлов в zip-файлах используются две поддерживаемые кодировки: UTF-8 и IBM437. Использование одной или другой из этих кодировок указано в метаданных zip, и любая библиотека zip может обнаружить и использовать ее. DotNetZip автоматически обнаруживает его при чтении совместимого почтового индекса. как это:

using (var zip = ZipFile.Read("thearchive.zip"))
{
    foreach (var e in zip) 
    {
        // e.FileName refers to the name on the entry
        e.Extract("extract-directory");
    }
} 

Существуют архивные программы, которые производят zip-файлы, которые не соответствуют w.r.t. кодирование. WinRar один - он создаст zip-файл с именами файлов, закодированными в кодировке по умолчанию, используемой на компьютере. В Шанхае он будет использовать cp950, а в Исландии - что-то еще, а в Лиссабоне - что-то еще. Преимущество «несоответствия» в том, что проводник Windows будет открывать и правильно отображать i18n-ized имена файлов в таких zip-файлах. Другими словами, «несоответствие» часто является тем, чего хотят люди, потому что Windows (пока?) Не поддерживает zip-файлы UTF-8.

(Это все связано с кодировкой, используемой в zip-файле, а не с кодировкой, используемой в файлах, содержащихся в zip-файле)

Спецификация zip не позволяет задавать произвольную кодировку текста в метаданных zip. Другими словами, если вы используете cp950 при создании zip, то ваша логика извлечения должна «знать», как использовать cp950 при извлечении - ничто в zip-файле не несет этой информации. Кроме того, конечно, библиотека zip, которую вы используете для программного извлечения, должна поддерживать произвольные кодировки. Насколько я знаю, в библиотеке zip Java этого нет. DotNetZip делает. Вот так:

using (ZipFile zip = ZipFile.Read(zipToExtract,
                                  System.Text.Encoding.GetEncoding(950)))
{
  foreach (ZipEntry e in zip)
  {
     e.Extract(extractDirectory);
  }
} 

DotNetZip также может создавать zip-файлы с произвольной кодировкой - "несовместимые" zip-файлы.

DotNetZip бесплатен и имеет открытый исходный код.

2 голосов
/ 02 декабря 2009

Решение, которое я нашел: Apache commons-compress может легко распаковать такие архивы, если они поставлены с правильной резервной кодировкой.

...