先に結論: macOSにてUTF-8でzip圧縮したくば,brewでzip 3.0を改めてインストールせよ
macOSとWindows間でのデータやり取りでzipを使った. 圧縮したフォルダ内には日本語(マルチバイト文字)のファイル名を持つものがあります.
Finderの右クリックメニューから圧縮すると余分なファイルが含まれたり,そもそも日本語がWindowsにて文字化けするなどの情報はあったので,ターミナル(Terminal.app)よりzipコマンドにてzip化を試みました.
macOS 10.15にプリインストールされているzipコマンドはバージョン3.0なのでUTF-8で圧縮してくれるとのこと(manページ参照). --unicode(-UN)オプションで文字コード指定が出来るといいます. また,--to-crlf(-l)オプションと一緒にすることでASCIIファイルの行末文字LFをMS-DOC互換のCR LFへ変換してくれるとのことだったので,次のコマンドで圧縮しました.
zip --unicode=UTF8 --to-crlf --recurse-paths archive.zip folder
オプションを省略してみると,次のようにすっきりします.
zip -UN=UTF8 -lr archive folder
これでフォルダfolderがarchive.zipになるはずでした. ところが,-UNオプションが不正であると言われてしまいます.
ダメ元でbrewでzipをインストールし,それを使うようにしてみました.
brew install zip
それからbrew link zipして表示されたコマンドを実行し,デフォルトzipコマンドとして設定します. わたしはzshを使っているので,次のコマンドでした.
echo 'export PATH="/usr/local/opt/zip/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
いざ,リトライしてみます.
zip -UN=UTF8 -lr archive folder
すんなり,うまくzip化されました. Windowsで展開しても,きちんとした文字コード(UTF-8)で展開されたので,日本語ファイル名も文字化けしていませんでした. なんらかの原因でmacOSに同梱されているzipコマンドはこのオプションを受け付けないようになっている様子です(あるいは単にバグ?). 謎は謎のままですが,きちんとzip 3.0をソースコードからビルドし直せば問題無いことは判明しました.
ちなみに,Windowsは8以降のエクスプローラーならば,そのzipがUTF-8か否か,判定できるようになっています(Windows 7でもパッチを当てればUTF-8判定してくれるようです). このUTF-8判定にはEFS(Language Encoding Flag)というフラグを見ているようです. 詳細は.zipファイルフォーマット仕様書のAPPNOTE.txtをご参照ください(こちらのQiita記事にEFSのことについて,とても丁寧にまとめてありましたので一読いただくと良いと思います).
以上,フォルダをzip圧縮するだけでしたが,日本語のようなASCII以外の文字が含まれていると想像以上に苦労するものです. 皆さんは時間を無駄にしないように,アーカイブフリーソフトのご利用を検討ください. 以上!