4

最近の人々は、WinZIP を使用して ZIP アーカイブを作成します。これにより、国際化された (つまり、非ラテン語: キリル文字、ギリシャ文字、中国語など) ファイル名が可能になります。

悲しいことに、そのようなファイルを解凍しようとすると問題が発生します。UNIX の解凍では、"®£¤ ©¤¥èì" のような名前の付いたファイルやディレクトリが作成されます。Java とその jar コマンドは、そのようなアーカイブでは惨めに失敗します。

そのようなファイルをプログラムで解凍するまずまずの方法はありますか? UNIX または Java。

4

2 に答える 2

3

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 は無料のオープン ソースです。

于 2009-12-06T12:39:30.070 に答える
2

私が見つけた解決策:Apache commons-compressは、正しいフォールバック文字セットが提供されていれば、そのようなアーカイブをうまく解凍できます。

于 2009-12-02T15:32:08.990 に答える