2009-06-26

_ Shift_JISなファイル名を含むZipファイルを解凍する

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

[]

トップ «前の日記(2009-04-30) 最新