zip および tar における日本語ファイル名なんかきらいだきらいだ問題への Go! 式回答

これ

中身は全部これ(追記部分)に書いたんで、そっちみろ、て話なんだけれど、なにせ元々のネタが 2015年に書いたものなんで、一応新しいネタとしての見出しだけでもあったほうがいいかなと思って。

「zip の日本語ファイル名には苦労させられている」という人は一定数いると思う。おそらくフリーのエッチな音声を、昔のアップローダからダウンロードしてきた、みたいなことをすると、そうした問題にブチ当たる、ので、きっとあなたはエロい…とは限らんけど、まぁそれなりに悩む人はいるだろうと思うわ。そうした人のうち「プログラミングを厭わず、さらに CUI に抵抗がない」人は、まぁ読んでもらえば役に立つかもしれんと思う。最初のネタは Python で、こちらのバージョンは「嫌いだ」への措置は不完全で、ここ数日で追記した Go バージョンは、一応「完全」のはず。ただし「Windows XP でエクスプローラで utf-8 ファイル名を使っている zip を開く」はダメよ、そうではなくて、「Windows 10 とかで古い sjis zip も新しい utf-8 zip も」ということね。

「プログラミングを厭わない」といったって、Go に関しては Go を PC にインストールしてビルドするだけの話だけれど、初めてだとわからんかもしれんので、ポイントだけ書いとく:

  1. ワタシのコード実例は package main のソース単独だけ見せているが、ビルドするためには go.mod が必要。
  2. go.mod を適宜作って「go build」したとしても、依存パッケージでエラーになるはずなので、その指示に従って「go get github.com/dsnet/compress/bzip2」などする必要がある。
  3. うまくいけば exe が出来上がる。

これだけ。たとえば「zip2tar」という名前にした場合、使い方は:

 1 [me@host: ~]$ # Windows XP とかで作ったふる~い zip を変換する例
 2 [me@host: ~]$ zip2tar.exe oldzip.zip newzip.zip
 3 [me@host: ~]$ 
 4 [me@host: ~]$ # Windows XP とかで作ったふる~い zip を変換する例2(tar+bz2に)
 5 [me@host: ~]$ zip2tar.exe oldzip.zip newzip.tar.bz2
 6 [me@host: ~]$ 
 7 [me@host: ~]$ # Windows XP とかで作ったふる~い zip を指定フォルダに展開する
 8 [me@host: ~]$ zip2tar.exe oldzip.zip mydir
 9 [me@host: ~]$ 
10 [me@host: ~]$ # Windows XP 中国語エディションとかで作ったふる~い zip を
11 [me@host: ~]$ # 指定フォルダに展開する(gbkがちゃんと動作する確認はしてないケドね)
12 [me@host: ~]$ zip2tar.exe oldzip.zip --encoding=gbk mydir2
13 [me@host: ~]$ 

名前に反して、個人的な用事のために「アーカイブをただ展開する」「フォルダをアーカイブにかためる」ことも出来るようにしてあるのだが、これは「ワタシが手持ちのものの中に PAX tar を理解するアンパッカーが Python しかないので、PAX tar アンパッカーそのものが既に価値がある」とかそんなことが理由。それでも名前を維持したのは、もとの話が「zip じゃのーてもちぃと圧縮率が高いものを使わんけ?」が動機のネタだったからね。ゆえ、本来は日本語ファイル名問題の解決道具ではなくて、名前の通り「zip なんかやだ、tar+bz2 やがれ」のために使う、のために作ったもの。まぁお好きに使いなはれ。