Cp949 shift-jis를 풀자

아마도 몇몇분을 제외하면 거의 모든 우분투사용자분들이
UTF8 (유니코드) 환경이실텐데
한글(cp949) 일본어(shift-jis) zip파일을 푸는데
natspec 패치먹인 unzip 6.0 버젼을
쓰지 못할 형편이시라면

다음 간단한 펄 스크립트를 써 보세요.
어떤 일본인 블로그에서 찾은 팁인데 정확한 주소는 기억안나네요.

일본어(shift-jis) zip파일 용:

[code:uxj0wg8l]#!/usr/bin/perl
use strict;
use Encode;
use Archive::Zip;
my $zip = Archive::Zip->new();
$zip->read($ARGV[0]) == 0 or
die "$0: couldn’t read $ARGV[0]\n";
foreach my $mref ($zip->members) {
my $n = decode("shiftjis",$mref->fileName);
print "Extracting $n\n";
$zip->extractMember($mref,$n) == 0 or
die "$0: couldn’t extract $n\n";
}[/code:uxj0wg8l]

한글(cp949) zip파일용:

[code:uxj0wg8l]#!/usr/bin/perl
use strict;
use Encode;
use Archive::Zip;
my $zip = Archive::Zip->new();
$zip->read($ARGV[0]) == 0 or
die "$0: couldn’t read $ARGV[0]\n";
foreach my $mref ($zip->members) {
my $n = decode("cp949",$mref->fileName);
print "Extracting $n\n";
$zip->extractMember($mref,$n) == 0 or
die "$0: couldn’t extract $n\n";
}[/code:uxj0wg8l]

/media/sdc1/test4$ perl jap1.pl zip_test_3470.zip
Extracting Zip_Test/
Wide character in print at jap1.pl line 10.
Extracting Zip_Test/新規テキスト ドキュメント.txt

/media/sdc1/test4$ ls -al Zip_Test
합계 12
drwxr-xr-x 2 reandr reandr 4096 2009-10-16 20:50 .
drwxr-xr-x 3 reandr reandr 4096 2009-10-16 20:50 …
-rw-rw-rw- 1 reandr reandr 37 2009-07-20 11:21 新規テキスト ドキュメント.txt

/media/sdc1/zip-test4$ perl kor1.pl korean.zip
Wide character in print at kor1.pl line 10.
Extracting 한국어.txt

/media/sdc1/zip-test4$ perl jap1.pl japanese.zip
Wide character in print at jap1.pl line 10.
Extracting 日本語.txt

멋진 펄스크립입니다.
저는 위 cp949 펄 스크립을 /usr/local/bin 에 kozip 이름으로 만들고 실행 권한 주었습니다. (755)
kozip 1.zip [b:1rn2t9ln]한글 이름 그대로 잘 폴리는 군요[/b:1rn2t9ln]
유용하게 사용 하겠습니다.

마운트 디렉보니 저랑 스타일이 비슷하십니다.
sdc1, sdc2
[attachment=0:1rn2t9ln]screenshot2.png[/attachment:1rn2t9ln]

파티션이 많다보니 게으른 천성에 귀찮아서 그냥 그렇게 씁니다.:)

[quote:16igwvfb]/media/sdc1$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda6 19G 16G 1.8G 91% /
tmpfs 760M 0 760M 0% /lib/init/rw
varrun 760M 212K 760M 1% /var/run
varlock 760M 0 760M 0% /var/lock
udev 760M 288K 760M 1% /dev
tmpfs 760M 12K 760M 1% /dev/shm
/dev/sda1 18G 16G 2.2G 89% /media/hda1
/dev/sdb5 9.5G 7.6G 1.5G 84% /media/hdb5
/dev/sdb6 8.5G 6.8G 1.3G 85% /media/hdb7
/dev/sdb7 9.8G 9.3G 551M 95% /media/hdb8
/dev/sdb8 30G 28G 1.6G 95% /media/hdb9
/dev/sdb1 16G 14G 1.6G 90% /media/sdb1
/dev/sdb2 9.8G 8.7G 1.2G 89% /media/sdb2
/dev/sdb4 28G 28G 708M 98% /media/sdb4
/dev/sdc7 25G 24G 1.1G 96% /media/sdc7
/dev/sdc8 24G 23G 989M 96% /media/sdc8
/dev/sdc6 28G 26G 389M 99% /media/sdc6
/dev/sdc2 75G 70G 1.3G 99% /media/sdc2
/dev/sdc1 80G 67G 8.4G 89% /media/sdc1
/dev/sdb9 1.1G 681M 310M 69% /media/sdb9[/quote:16igwvfb]

Can’t locate Archive/Zip 오류로
sudo apt-get install libarchive-zip-perl [url=http://www.oooforum.org/forum/viewtopic.phtml?t=67262:13v1x0ai]출처[/url:13v1x0ai]
이 꾸러미를 깔고서 잘 됩니다. :( :) :D

[quote="nundol":3thw5imj]Can’t locate Archive/Zip 오류로
sudo apt-get install libarchive-zip-perl [url=http://www.oooforum.org/forum/viewtopic.phtml?t=67262:3thw5imj]출처[/url:3thw5imj]
이 꾸러미를 깔고서 잘 됩니다. :( :) :D[/quote:3thw5imj] 저는 karmic 팁만 보고 계속해도 안되길래, 이상하다 생각하고 있었는데…
원글을 보니 해결 방법이 있었군요. ^^
감사합니다.

php 용으로 만들어 보았습니다.
마찬가지로 /usr/local/bin 밑에 두고 쓰시면 편할 것 같습니다.
php 커맨드라인인터프리터가 없다면 php-cli 꾸러미를 설치하시면 됩니다.

[code:bltaafk4]
#!/usr/bin/env php
<?php
// author: hue319@gmail.com
$zip=new ZipArchive();
$argv=$_SERVER["argv"];

if (!$argv[1]) exit("사용법: $argv[0] <zipfile> \n");
else $filename=$argv[1];
if ($zip->open($filename)!==TRUE) exit("<$filename> 파일을 찾을 수 없습니다.\n");
// echo "압축파일 <".$filename.">은 아래 파일을 포함하고 있습니다.\n";

for ($i=0; $i<$zip->numFiles;$i++) {
$statIndex=$zip->statIndex($i);
$utf8=iconv("EUC-KR", "UTF-8", $statIndex["name"]);
$zip->renameIndex($i, $utf8);
$zip->extractTo("./", $utf8);
$zip->unchangeIndex($i);
echo "풀기: ".$utf8."\n";
}
$zip->close();
?>
[/code:bltaafk4]

왜 진작 이런 거 만들 생각을 못했을까. 매번 vbox 로 부팅한 후 압축 풀었었는데…
루비 버전입니다.

[code:b7arle7q]파일이름 unzip_cp949_to_utf8
--------------시작----------------
#!/usr/bin/ruby

libzip-ruby1.8 패키지를 설치한 후 사용할 수 있습니다.

사용법: $ ruby unzip_cp949_to_utf8 zipfile.zip

require ‘fileutils’
require ‘zip/zip’
require ‘zip/zipfilesystem’ # ruby 1.8.x
require ‘iconv’

def unzip
Zip::ZipFile.open(ARGV[0]) do |zipfile|
zipfile.each do |f|
# libzip-ruby1.9 아직 없음. 그래서 아래 문장 주석 처리
#utf_string = f.name.encode("utf-8") # for ruby1.9 or higher
# cp949 파일 이름을 utf-8로 변환
utf_string = Iconv.conv("UTF-8", "CP949", f.name) # for both ruby1.8.x and ruby1.9.x
FileUtils.mkdir_p(File.dirname(utf_string))
zipfile.extract(f, utf_string)
puts utf_string
end
end
end

unzip
----------------끝---------------------[/code:b7arle7q]

저의 경우에는 펄 스크립트가 아래와 같은 에러가 나길래…

[quote:gi6r6mh1]Can’t locate Archive/Zip.pm in @INC[/quote:gi6r6mh1]libarchive-any-perl 패키지를 설치하고 실행하니까 아주 잘되는군요.

감사합니다. unzip-enc 만들어서 /usr/bin에 복사해 넣었습니다. ㅋㅋ

[code:gi6r6mh1]#!/usr/bin/perl
use strict;
use Encode;
use Archive::Zip;

if ( $#ARGV < 1 )
{
print <<END;

Extracting Zip file for another encoding.

Usage:
$0 Encoding Filename

Simple encoding list:
utf8 \tcp949 \teuc-kr
shiftjis\teuc-jp \t...

Example:
unzip-enc cp949 kor.zip

END
die "$0: Please input Encoding and Filename.\n\n";
}

my $zip = Archive::Zip->new();
$zip->read($ARGV[1]) == 0 or
die "$0: couldn’t read $ARGV[1]\n";

foreach my $mref ($zip->members)
{
my $n = decode("$ARGV[0]",$mref->fileName);
print "Extracting $n\n";
$zip->extractMember($mref,$n) == 0 or
die "$0: couldn’t extract $n\n";
}
[/code:gi6r6mh1]