ZIPのUnicode対応
LHAが済んだので今度はZIPです。
ざっと調べた限り、ZIPのファイル名には次の四種類があるようです。
- 既定のIBMコードページ437
- UTF-8(General Purpose Bit Flagの11ビット目が立っている場合)
- 同じくUTF-8(Info-ZIP Unicode Path Extra Fieldを使う)
- ネイティブのファイル名をそのまま(標準外)
おそらく一番多いのは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のヘッダが読まれなかったのでバグってるかもしれません。