分页: 1 / 1

解决zip解压包中文文件名乱码的脚本

发表于 : 2010-12-30 16:24
trailbreaker
最近因为碰到了从windows上传过来的zip压缩包,解压缩后中文文件名出现乱码问题。
google了一通后把几个指令合在一起,一步解决子目录嵌套下文件名编码转换
不过因为刚学perl,这段代码基本上是抄抄改改,将就着能用,还有些不致命错误不知道怎么去解决,希望高手能帮忙 :em03

代码: 全选

#!/usr/bin/perl -w
#unzip.pl 
#用于解决windows下用zip压缩的文件到linux下时因编码问题而造成的文件名乱码
#gb2312(cp936) 转至 UTF8
#需要外部命令 7z 与 convmv (安装包p7zip-full,convmv)
#
use strict;
use warnings;

if ( $#ARGV < 0 ){
   print "Usage: unzip.pl zipfilename\n";
   exit -1;
}else{
@fn = split /\./,$ARGV[0],2;
if(-e $ARGV[0]){
	`LANG=C 7z x -o@fn[0] $ARGV[0]`;
	chdir @fn[0];
	`convmv --notest -f cp936 -t utf8 *`;
	my @tree=<*>;
	foreach (@tree){
		&if_a_tree($_);
	}
	sub if_a_tree{
	if(-d){
#		print "$_ is a directory\n";
		chdir $_;
		`convmv --notest -f cp936 -t utf8 *`;
		my @tree=<*>;
		foreach(@tree){
			&if_a_tree($_);
		}
		chdir "..";
	}
#	if(-f){
#		print "$_ just a file\n";
#	}
	}
}else{
print "文件不存在!!\n";
exit;
}
}
正常运行后的提示内容为
Scalar value @fn[0] better written as $fn[0] at ./3.pl line 18.
Scalar value @fn[0] better written as $fn[0] at ./3.pl line 19.
检查未输入文件名时出现的提示内容
Scalar value @fn[0] better written as $fn[0] at ./3.pl line 17.
Possible unintended interpolation of @fn in string at ./3.pl line 17.
Scalar value @fn[0] better written as $fn[0] at ./3.pl line 18.
Global symbol "@fn" requires explicit package name at ./3.pl line 15.
Global symbol "@fn" requires explicit package name at ./3.pl line 17.
Global symbol "@fn" requires explicit package name at ./3.pl line 18.
BEGIN not safe after errors--compilation aborted at ./3.pl line 20.

Re: 解决zip解压包中文文件名乱码的脚本

发表于 : 2010-12-30 22:15
astolia

代码: 全选

find -depth -exec convmv -f gbk -t utf8 --notest {} \;
:em04

虽然不懂perl,不过Scalar value @fn[0] better written as $fn[0] at ./3.pl line 18.这句是叫你最好将@fn[0]改成$fn[0]

Re: 解决zip解压包中文文件名乱码的脚本

发表于 : 2010-12-31 19:35
trailbreaker
谢谢楼上的提醒,把原来15,17,18行代码改了一下,是我数组变量用的不正确
方法1:

代码: 全选

my ($fn,$fk) = split /\./,$ARGV[0],2;
if(-e $ARGV[0]){
        `LANG=C 7z x -o$fn $ARGV[0]`;
        chdir $fn;
方法2:

代码: 全选

my @fn=("","");
@fn = split /\./,$ARGV[0],2;
if(-e $ARGV[0]){
        `LANG=C 7z x -o$fn[0] $ARGV[0]`;
        chdir $fn[0];
现在一切正常了 :em05

Re: 解决zip解压包中文文件名乱码的脚本

发表于 : 2011-01-04 14:53
rediscover

Re: 解决zip解压包中文文件名乱码的脚本

发表于 : 2011-01-04 14:58
eexpress
chdir @fn[0];

当然是$fn[0]拉。。。

use strict;
了。你的@fn都没带my的。。。

Re: 解决zip解压包中文文件名乱码的脚本

发表于 : 2011-01-04 16:41
lilydjwg
http://lilydjwg.is-programmer.com/posts/16293.html Python3 版。另有没有在维护的 Python2 版在此论坛中。