Windowsから送られてきた Zipファイルの展開

僕は仕事はLinuxで行っているのですが、お客さんは Windowsがほとんどです。
そんなお客さんから Zipファイルが送られてくることがたまにありますが、
それを普通に unzipしてしまうと文字化けしてどれがどのファイルかが
よくわかりません。


昔のubuntuだと unzipの "-O"オプションで文字コードを指定できた
はずなんだけど、アップグレードをかけたらその機能が使えなくなっていた。
なんで適当にネットで探していたらそれを実現する Perlスクリプト
ありました。ただそれだと入力文字コードが 'cp932'、出力文字コード
utf-8で固定されていたの若干修正を加えたものを示します。

#!/usr/bin/env perl
use strict;
use warnings;

use Term::Encoding qw(term_encoding);
use Archive::Zip;
use Getopt::Long;
use Encode;

my ($from_encoding, $to_encoding);

GetOptions(
    "from|f=s" => \$from_encoding,
    "to|t=s"   => \$to_encoding,
);

$from_encoding ||= 'cp932';
$to_encoding   ||= term_encoding();

my $zipfile = shift or die "usage $0 [--from encoding] [--to encoding] zip_file\n";

my $zip = Archive::Zip->new($zipfile);
my @compressed_files = $zip->memberNames;

foreach my $file (@compressed_files) {
    my $decoded_file = decode($from_encoding, $file);

    print "Extract file:", encode($to_encoding, $decoded_file), "\n";
    $zip->extractMember($file, encode($to_encoding, $decoded_file));
}

使い方

  % unzip.pl --from cp932 --to utf-8 ほげほげ.zip

"--to"オプションを省略すると現在のターミナルに設定している
文字コードになります。