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 бесплатен и имеет открытый исходный код.