要するにタイトルの通りなんですが、 よく知られているように、 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が対応してくれていないのが一番厄介なんですが。