H2Databaseを追っかけていたりしたブログ

H2 database のリリースノートを読んだりとか。

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()

ここらへん、それぞれの言語で対応してない、というのはライセンス上の問題なんですかね。