最近、 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 フラグを使用せずにファイル名のエンコードを合理的に試みたい場合、何を探すことができますか?