僕は仕事は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"オプションを省略すると現在のターミナルに設定している
文字コードになります。