System.Zip.TZipFile を利用して zip ファイルを解凍すると、日本語を含むファイル名の文字化けが発生する
問題
System.Zip.TZipFile クラスのExtractAllメソッドもしくはExtractZipFileメソッドを利用してzipファイルを解凍すると、zipファイル内に格納されている日本語文字列を含むファイル名が文字化けします。
またその際、例外クラス「EArgumentException」例外メッセージ「パスに無効な文字が含まれています」が表示されます。
原因
System.Zip.TZipFileクラスは、もともと以下のような仕様で実装されております。
- UTF-8 ファイル名に対応
- UTF-8 ファイル名の使用有無 は UTF8Support プロパティで切り替えられる
- UTF8Support が False の場合、使用される文字エンコーディングは CP437 (IBM PC / MS-DOS)
詳しくは、こちらの"APPENDIX D - Language Encoding (EFS)"を参照ください。
例えば、Windows標準で利用可能なZIPユーティリティで圧縮した場合は 、文字コード形式はUTF8ではなく、MS932でファイル名をエンコードしているため、System.Zip.TZipFileクラスのExtractAllメソッド等でファイルを展開すると、文字コードの不一致によって文字化けが発生します。「パスに無効な文字が含まれています」というエラーは、その結果です。
なお、この挙動は不具合ではなく、上述した仕様に基づきSystem.Zip.TZipFileがShift-JIS/MS932の文字コードをサポートしていないことが理由となります。
解決
本件を解決するためには、
- UTF8に対応したZIPファイル圧縮解凍ソフト(例えば、Explzh for Windows等)を利用する
- System.Zip.TZipFileクラスを利用して、ファイルの圧縮/解凍を行う