DotNetZipは、zip ファイルの読み取りまたは書き込みのために、zip ファイル内のファイル名の Unicode および任意のエンコーディングをサポートします。
.NET ライブラリです。Unix を使用する場合、前提条件として Mono が必要です。
zipfile が WinZip によって正しく構築されている場合、つまりPKWare の zip 仕様に準拠している場合は、解凍時にエンコーディングを指定するために必要な特別な作業はありません。zip 仕様によると、zip ファイル内のファイル名に使用されるサポートされているエンコーディングは、UTF-8 と IBM437 の 2 つです。これらのエンコーディングのいずれかの使用は、zip メタデータで指定されており、任意の zip ライブラリがそれを検出して使用できます。DotNetZip は、準拠した zip を読み取るときに自動的に検出します。このような:
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 を生成するアーカイブ プログラムがあります。WinRar はその 1 つです。コンピューターで使用されているデフォルトのエンコードでエンコードされたファイル名を持つ zip を作成します。上海では cp950 を使用し、アイスランドでは別のもの、リスボンでは別のものを使用します。ここでの「非準拠」の利点は、Windows エクスプローラーが開いて、そのような zip 内の i18n 化されたファイル名を正しく表示することです。言い換えれば、Windows は (まだ?) UTF-8 zip ファイルをサポートしていないため、「非準拠」がしばしば人々の望みです。
(これはすべて、zip ファイルに含まれるファイルで使用されるエンコーディングではなく、zip ファイルで使用されるエンコーディングに関係しています)
zip 仕様では、zip メタデータで任意のテキスト エンコーディングを指定することはできません。つまり、zip の作成時に cp950 を使用する場合、抽出ロジックは抽出時に cp950 を使用することを「認識する」必要があります。zip ファイルにはその情報は含まれていません。さらに、もちろん、プログラムで抽出するために使用する zip ライブラリは、任意のエンコーディングをサポートしている必要があります。私の知る限り、Java の zip ライブラリにはありません。DotNetZip が行います。そのようです:
using (ZipFile zip = ZipFile.Read(zipToExtract,
System.Text.Encoding.GetEncoding(950)))
{
foreach (ZipEntry e in zip)
{
e.Extract(extractDirectory);
}
}
DotNetZip は、任意のエンコーディングの zip ファイル (「非準拠」zip) を作成することもできます。
DotNetZip は無料のオープン ソースです。