要するにタイトルの通りなんですが、 よく知られているように、 Windowsで日本語を含むファイル名があったとき、 Zipファイルの中にはそのままShift_JISでエンコードされたままの文字列が入ってきます。 そして、Linuxとか、普通UTF-8を使うことになっている環境で展開しちゃうと、unzipが頭悪くて、うまく変換してくれたりはしません。 もっと悪いことに、Shift_JISは2バイト目にASCIIコードで言うとバックスラッシュ相当のコードが入っていたりするんで、 これをunzipがパスの区切りだと勘違いして、変なディレクトリを掘ってくれたりとか、もう勘弁してくださいって状態になります。
Ubuntuとかには、対策済みのunzip-jaとかがあるらしいんですが、 私の使っているMandriva Linuxにはそんなものはないみたいです。 自分でRPMを作ってもいいんですが、面倒くさかったので、 手っ取り早くPythonで作ってしまいました。 即席なので、機能もコードもいい加減ですが、一応自分に必要な程度には動きます。
#! /usr/bin/python import zipfile import sys zips = sys.argv[1:] if not zips: print 'Usage: unzip-sjis ZIPFILE...' sys.exit() for zip in zips: print 'Archive: %s' % (zip,) f = zipfile.ZipFile(zip, 'r') try: for member in f.namelist(): try: name = member.decode('sjis').encode('utf8') except: # maybe UTF-8 originally name = member.decode('utf8').encode('utf8') print ' inflating: %s' % (name,) out = open(name, 'wb') try: out.write(f.read(member)) finally: out.close() finally: f.close()
フォルダーのあるZipファイルには対応していないし、パスワードとかも無視しているし、解凍したファイルを一度にメモリにロードしちゃってるので、無駄にメモリを食うし、ツッコミどころは満載ですが、 私はこれぐらいでとりあえず済んでいるので。 足りてないところを直すのは簡単なので、当分このスクリプトで耐え忍ぶ予定です。
正直に言って、Arkが対応してくれていないのが一番厄介なんですが。