Chinaunix首页 | 论坛 | 博客
  • 博客访问: 49866
  • 博文数量: 15
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 180
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-31 11:18
文章分类
文章存档

2010年(14)

2009年(1)

我的朋友

分类: LINUX

2010-09-02 08:47:11

自己用的是日文的linux系统,昨天从同事那儿收了个压缩文件,结果解压之后文件名都乱吗了(内容正常显示)。网上google了以下发现是因为windows下默认的编码方式时Shift-JIS,到了linux下之后虽然内容可以显示但是文件名却乱码。解决方法也挺简单的,perl提供了一些方法,直接写一个简短的程序即可。

我也是从其他地方参照的,给一个例子程序。(这里需要安装Archive::Zip模块
#!/usr/bin/perl

use strict;
use warnings;
use Archive::Zip qw( :ERROR_CODES :CONSTANTS );
use Encode qw/from_to/;
use Getopt::Long;
use DateTime;
use DateTime::TimeZone::Local;

GetOptions('list|l' => \ my $mode_list);
if (scalar @ARGV < 1) {
  print "Usage: $0 [-l] \n";
  exit 1;
}
my $zipfile = shift @ARGV;

my $zip = Archive::Zip->new();
unless ( $zip->read($zipfile) == AZ_OK ) {
  die 'read error';
}
print "Archive: $zipfile\n";
if ($mode_list) {
  print <
   Length     Date    Time   Name
 --------  ---------- -----  ----
HERE
}
my $total_size = 0;
my @members = $zip->members();
my $members_count = scalar @members;
foreach my $member (@members) {
  my $filename = $member->fileName;
  from_to($filename, 'cp932', 'utf8');
  if ($mode_list) { 
    my $dt = DateTime->from_epoch(
      epoch => $member->lastModTime
    )->set_time_zone(DateTime::TimeZone::Local->TimeZone());
    $total_size += $member->uncompressedSize;
    printf "%9d  %s  %s\n",
      $member->uncompressedSize,
      $dt->ymd('-') . ' ' . sprintf("%02d", $dt->hour) . ':' . sprintf("%02d", $dt->min),
      $filename;
  } else { 
    print "  inflating: $filename\n";
    unless (defined $zip->extractMember($member, $filename)) {
      warn "  failed: $filename\n";
    }
  }
}
my $members_count_str = "$members_count file" . ($members_count > 1 ? 's' : '');
if ($mode_list) {
  print <
 --------                    -------
HERE
printf "%9d                    %s\n", $total_size, $members_count_str;
}
阅读(2681) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-09-04 14:36:06

Download More than 1000 free IT eBooks: http://free-ebooks.appspot.com