2009-12-02 2 views
4

Люди в эти дни создают свои ZIP-архивы с помощью WinZIP, что позволяет использовать имена файлов в интернационализированных (то есть не латинских: кириллические, греческие, китайские, имена).Разархивировать файлы, созданные с помощью WinZIP с именами файлов I18N?

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

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

ответ

2

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

3

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

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

Если zipfile был правильно сконструирован WinZip, другими словами, если он соответствует the zip spec from PKWare, то вам не нужно выполнять специальную работу, чтобы указать кодировку в момент ее распаковки. Согласно спецификации zip, существуют два поддерживаемых кодировки, используемые для имен файлов в zipfiles: 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"); 
    } 
} 

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

(Все это связанно с кодировкой, используемой в ZipFile, а не кодирование используется в файлах, содержащихся в файле почтового индекса)

почтовый индекс спецификация не позволяет спецификацию произвольной кодировки текста в метаданных 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 также может создавать файлы почтового индекса с произвольными кодировками - «не соответствует» молниями.

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

+1

Спасибо, но установка 7z была проще, потому что она уже находится в репозитории. – alamar

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