2011-01-11 12 views
4

DotNetZipライブラリを使用してファイルを解凍しようとしています。DotNetZipライブラリを使用する非ASCII文字でファイルを解凍する

ファイルには、デンマーク語(æøåÆØÅ)のフォルダとファイルが含まれています。

TotalCommander、7Zip、Windows独自のzipはすべてファイルを正しく抽出しますが、DotNetZip Libraryはデンマーク語の文字をマングリングします。

例:File_æøåÆØÅ.txtは、それが¢が含まれているFile_æ¢åÆ¥Å.txt

instedになります。 insted of a Øこれには¥が含まれています。

コード:UTF8などのような

using (var zipFile = ZipFile.Read(@"File_æøåÆØÅ.zip")) 
{ 
    zipFile.ExtractAll(@"File_æøåÆØÅ", 
         ExtractExistingFileAction.OverwriteSilently); 
} 

私はデフォルトのエンコーディング(「DA-DK」文化)を使用しています、私が試した他のエンコーディング

私は、ファイル名を含むファイルを解凍するにはどうすればよいですデンマーク語の文字で?

+0

Sharpziplib http://www.icsharpcode.net/opensource/sharpziplib/が動作します。 –

答えて

0

これは単に "DotNetZip"のバグのようです - SharpZipLibまたはZipPackage(BCL内)を試してみましたか?エンコードは通常、ファイル名に関連しています。だからこれは要因ではないはずです。

投稿者にreport this(例あり)する必要があります。

+0

SharpZipLibで動作します。 –

+5

これはバグではありません。 DotNetZipは、ファイル名の非ASCII文字に関してzip仕様に従います。そのようなzipファイルを読むときにコードページを指定できるZipFile.Read()オーバーロードを使用する必要があります。 ZIP仕様では、サポートされているデフォルトの形式はIBM437(事実上ASCIIのサブセット)とUTF8です。ファイルが明示的にコードページを指定する必要がないファイルの場合、zipファイルから正しいページを確実に推論する方法はありません。他のライブラリと同様に、それが「デスクトップ上のデフォルトのコードページ」であると仮定すると、不正確で危険です。 – Cheeso

+0

また、コードページの取り扱いは、すべてDotNetZipのヘルプファイルで広く文書化されています。おそらくおそらく、 – Cheeso

2

私は読書のためにファイルストリームを使用していましたが、それが動作していた(DotNetZip-v1.9)ことを覚えていました。読書のためのコード:

using (FileStream fs = File.OpenRead(filePath)) 
{ 
    ZipFile zf = ZipFile.Read(fs); 
    ICollection<ZipEntry> entries = zf.Entries; 
    foreach (ZipEntry entry in entries) 
    { 
      string path = entry.FileName; // 
    } 
} 

およびZIPアーカイブを作るため:ZipFile zip = new ZipFile(Encoding.UTF8);

3

は、zipファイルを読み込むときにデンマークのコードページを指定して明示的に、そのzipファイルを処理するために:

var encoding = System.Text.Encoding.GetEncoding("da-DK"); 
using (var zipFile = ZipFile.Read(@"File_æøåÆØÅ.zip", encoding)) { 
    zipFile.ExtractAll(@"File_æøåÆØÅ", 
        ExtractExistingFileAction.OverwriteSilently); 
} 

理由ますこれを明示的に行う必要があります。
zip仕様では、zipファイル内のファイル名とコメントの2つのテキストエンコードが可能です(IBM437とUTF8)。これらの準拠のエンコーディングのいずれかが使用されるとき、zipfileメタデータはそれを明示的に指定します。 DotNetZipまたは任意のライブラリは、zipファイルで指定されたエンコーディングを確実に使用できます。

zipファイルで、これらの2つのうちの1つではないエンコードを指定する方法はありません。 ZIP仕様ではこれを行う方法は提供されていません。いくつかのzipライブラリやツールは、この点で仕様に準拠していないzipファイルを作成します。 zipファイルは "da-DK"やCP950などのテキストエンコーディングを使用します。厳密に言えば、それらは仕様に準拠していませんが、ツールはそれらを構成します。このようなZipファイルは珍しいことではありません。

このような場合、zipファイルで使用されるエンコーディングがマシンのデフォルトエンコーディングと同じであると思われるライブラリやツールがあります。これは安全ではなく、動作することが保証されていますが、zipファイルがローカルマシン上の非準拠のライブラリやツールによって作成された小規模なケースで動作するという前提です。既定の(準拠していない)テキストエンコーディングでzipファイルを作成し、それをStokholmから上海に送信すると、読み込み時に "default encodingを使用する"戦略を使用すると失敗します。

DotNetZipは前提をしません。 zipファイルが非準拠のテキスト・エンコーディングを使用する場合、ZIPファイルにはどのエンコーディングが使用されているかの指示がないため、DotNetZipは標準のエンコーディング - IBM437 - を使用してファイルを読み取ります。 DNZがこれが「間違っている」ことを知る方法はありません。その動作をオーバーライドする場合は、別のエンコーディングを受け入れるZipFile.Read()メソッドを使用する必要があります。

これは、すべてDotNetZip documentationの中で、特にZipFile.ProvisionalAlternateEncodingのプロパティに記述されています。それは常に、実際に使用するジップ何にもかかわらず、ジップエンコーディングをオーバーライドするため

0

zip.AlternateEncodingUsage = ZipOption.Always; 

を使用してDotNetZipのデフォルトのエンコーディングをオーバーライドの最初のは危険です。 私は必要なときに

zip.AlternateEncoding = System.Text.Encoding.UTF8; 
zip.AlternateEncodingUsage = ZipOption.AsNecessary; 

だから、UTF-8を使用して自分で使用しています。

コードページの議論に関連しています - 私はこれをdotnetzip自身(ローカルコピー)内で修正し、デフォルトのコードページを "ibm437"から "ibm861"に変更しました。

私は特殊な種類のzipを作成するために7-zipとwindows zipツールを使用しましたが、ファイル名に特殊文字 'ø'を使用していました。テスト結果に基づいて、Windowsおよび7-zipで使用されるデフォルトのエンコーディングは、ほとんどのドキュメンテーションのように "ibm437"ではなく "ibm861"です。

"ibm437"文字列を検索し、それをdotnetzip自体の中の "ibm861"と置き換えることで、修正を適用できます。 http://www.nudoq.org/#!/Packages/DotNetZip/Ionic.Zip/ZipInputStream/P/ProvisionalAlternateEncoding

0

私は解凍して、問題を持っていた:私はエンコードのページについていくつかの言及がありますのはここ

です。 zipファイルでは、私のアプリはšđčćžのような特別な東ヨーロッパの文字を持っているはずです。 WinRARまたは7Zipはそれをうまく解凍しましたが、DNZライブラリ(IonicZip 1.9.1.8)ではμが得られました。

私は15の異なるエンコンディングのように試していましたが、最終的に与えられたzipファイルがibm852であることがわかりました。さて、このサンプルコードは、私のために働いた:次のスニペットに似AlternateEncodingプロパティを設定

ZipFile zf = new ZipFile(path, System.Text.Encoding.GetEncoding("ibm852")); 
zf.ExtractAll(loc, ExtractExistingFileAction.OverwriteSilently); 

は私を助けていませんでした:

using (ZipFile zz = ZipFile.Read(path)) 
{ 
    zz.AlternateEncodingUsage = ZipOption.Always; 
    zz.AlternateEncoding = System.Text.Encoding.GetEncoding("ibm852"); 
    zz.ExtractAll(loc, ExtractExistingFileAction.OverwriteSilently); 
} 

私は理由を調査する時間を持っていない、おそらくあなたがしなければなりませんReadメソッドでエンコーディングパラメータが見つからないため、コンストラクタを呼び出すときにエンコーディングを設定しました。

関連する問題