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