Windowsで作成された、ファイル名に日本語を含むファイル含むzipを、Linux上で展開
unzipでファイル名が化けてしまうのは仕方がないが、Javaだったら簡単に書けるのでは、と思ったらさにあらず。標準のZipIn(Out)putStreamでは、パスワードつきのzipの読み書きに対応していない。
それじゃ、Perlではどうよ、と思ったらArchive::Zipも対応していない(パスワードなしでよければ、ワンライナーで書けた。イカす)
perl -MArchive::Zip -MEncode -e 'map{ $_->extractToFileNamed(decode("shiftjis",$_->fileName()))} Archive::Zip->new("a.zip")->members()'
rubyでも標準では駄目っぽい(gem入れたりはしたくなかったので)
かろうじて、pythonがパスワード付きのzipの読みだけは、対応していたので、pythonで書いてみた。
import zipfile import os zf = zipfile.ZipFile('abc.zip','r'); zf.setpassword('def'); for f in zf.namelist(): if not os.path.exists(os.path.dirname(f)): os.mkdir(os.path.dirname(f)) uzf = file(f.decode('cp932'),'wb') uzf.write(zf.read(f)) uzf.close() zf.close()
ここらへん、それぞれの言語で対応してない、というのはライセンス上の問題なんですかね。