ZIPのUnicode対応

LHAが済んだので今度はZIPです。
ざっと調べた限り、ZIPのファイル名には次の四種類があるようです。

  1. 既定のIBMコードページ437
  2. UTF-8(General Purpose Bit Flagの11ビット目が立っている場合)
  3. 同じくUTF-8(Info-ZIP Unicode Path Extra Fieldを使う)
  4. ネイティブのファイル名をそのまま(標準外)

おそらく一番多いのは4.で、日本語Windows環境なら大抵ShiftJISを使っています。
2.はZIP仕様にある正式な方法で、SecureZIPでUTF-8のオプションをオンにすると使えます。
ただ、これに対応していないアーカイバが多いのと、そのようなアーカイバでは日本語ファイル名が文字化けするのが難点です。
3.の方法はZIP仕様にもInfo-ZIP拡張として載っているものの、Info-ZIP自体が使ってない模様です。


これらを踏まえ、Unicodeファイル名の書き出しはInfo-ZIP方式を使うことにしました。

パス ファイル名読み込み Info-ZIP拡張読み込み ファイル名書き出し Info-ZIP拡張書き出し
path そのまま 既定のCPに変換 既定のCPのまま しない
wpath 既定のCPと仮定してワイド文字に変換 そのまま 既定のCPに変換 そのまま


で、書き出しだけ実装できました。
差分
試しに作成したZIPファイルをSecureZIPで開いてみましたが、Info-ZIPのヘッダが読まれなかったのでバグってるかもしれません。