11

最近、 zipzapという zip ファイル I/O ライブラリを作成しましたが、任意の zip ファイルから zip エントリ ファイル名を正しくデコードするのに苦労しています。

現在、PKWARE 仕様には次のように記載されています。

D.1 ZIP 形式は、歴史的に、一般に IBM Code Page 437 と呼ばれる元の IBM PC 文字エンコーディング セットのみをサポートしてきました...

D.2 汎用ビット 11 が設定されていない場合、ファイル名とコメントは元の ZIP 文字エンコーディングに準拠する必要があります。汎用ビット 11 が設定されている場合、ファイル名とコメントは、UTF-8 ストレージ仕様で定義された文字エンコード形式を使用して、Unicode 標準バージョン 4.1.0 以降をサポートする必要があります...

これは、EFS ビットが設定されていない限り、適合する zip ファイルがファイル名を CP437 としてエンコードすることを意味します。この場合、ファイル名は UTF-8 です。

残念ながら、多くの zip ツールは EFS ビットを正しく設定していない (Mac CLI、GUI zip など) か、他のエンコーディング、通常はデフォルトのシステム エンコーディング (WinZip など) を使用しているようです。WinZip、7-Zip、Info-Zip、PKZIP、Java JAR/Zip、.NET zip、 dotnetzipなどでファイル名をエンコードする方法と、圧縮時に「作成者のバージョン」フィールドを設定する方法を知っている場合は、教えてください。 .

特に、Info-Zip は解凍時に次のことを試みます。

  • ファイルシステム = MS-DOS (0) => CP437
    • 例外: バージョン = 2.5、2.6、4.0 => ISO 8859-1
  • ファイル システム = HPFS (6) => CP437
  • ファイル システム = NTFS (10) およびバージョン = 5.0 => CP437
  • それ以外の場合は、ISO 8859-1

任意の zip ファイルの検査または抽出をサポートし、EFS フラグを使用せずにファイル名のエンコードを合理的に試みたい場合、何を探すことができますか?

4

2 に答える 2

6

現時点での状況は以下の通りです。

  • ほとんどの Windows 実装は DOS (OEM) エンコーディングを使用します。
  • Mac OS zip ユーティリティは utf-8 を使用しますが、utf-8 ビット フラグを設定しません
  • *nix zip ユーティリティはシステム エンコーディングを黙って使用します

したがって、唯一の方法は、ファイル名に utf-8 文字のようなものが含まれているかどうかを確認することです (utf8 エンコーディングの説明を確認してください - 最初のバイトは 110xxxxx で、2 番目のバイトは 2 バイトでエンコードされた文字の場合は 10xxxxxx です)。正しい utf8 文字列の場合 - utf8 エンコーディングを使用します。そうでない場合は、OEM/DOS エンコーディングにフォールバックします。

于 2012-11-11T12:09:37.463 に答える
3

EFSフラグを使用せずにファイル名がUTF-8としてエンコードされているかどうかを判断する唯一の方法は、文字の1つに上位ビットが設定されているかどうかを確認することです。これは、文字がUTF-8でエンコードされていることを意味している可能性があります。ただし、CP437には上位ビットが設定されており、UTF-8としてデコードされることを意図していない文字がいくつかあるため、それでも逆の可能性があります。

私はPKWAREアプリノートの仕様に固執し、存在するすべての既知のzipアプリケーションに準拠しようとするソリューションをハックしません。

于 2012-11-07T00:31:46.470 に答える