当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 6 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 解决zip解压包中文文件名乱码的脚本
帖子发表于 : 2010-12-30 16:24 

注册: 2010-12-20 21:22
帖子: 5
送出感谢: 0 次
接收感谢: 0 次
最近因为碰到了从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.


页首
 用户资料  
 
2 楼 
 文章标题 : Re: 解决zip解压包中文文件名乱码的脚本
帖子发表于 : 2010-12-30 22:15 
头像

注册: 2008-09-18 13:11
帖子: 2770
送出感谢: 1
接收感谢: 449
代码:
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]


页首
 用户资料  
 
3 楼 
 文章标题 : Re: 解决zip解压包中文文件名乱码的脚本
帖子发表于 : 2010-12-31 19:35 

注册: 2010-12-20 21:22
帖子: 5
送出感谢: 0 次
接收感谢: 0 次
谢谢楼上的提醒,把原来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


页首
 用户资料  
 
4 楼 
 文章标题 : Re: 解决zip解压包中文文件名乱码的脚本
帖子发表于 : 2011-01-04 14:53 

注册: 2010-01-13 23:26
帖子: 3173
送出感谢: 0 次
接收感谢: 12
http://blogs.gnome.org/happyaron/2010/0 ... encodings/

有个shell版的。 :em06


_________________
Here I am.
Ubuntu 桌面培训 - 全中文官方文档,含汉化截图,提供PDF


页首
 用户资料  
 
5 楼 
 文章标题 : Re: 解决zip解压包中文文件名乱码的脚本
帖子发表于 : 2011-01-04 14:58 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 274
chdir @fn[0];

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

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


_________________
● 鸣学


页首
 用户资料  
 
6 楼 
 文章标题 : Re: 解决zip解压包中文文件名乱码的脚本
帖子发表于 : 2011-01-04 16:41 
头像

注册: 2009-04-11 23:46
帖子: 4130
系统: Arch Linux
送出感谢: 11
接收感谢: 124
http://lilydjwg.is-programmer.com/posts/16293.html Python3 版。另有没有在维护的 Python2 版在此论坛中。


_________________
我的博客 https://blog.lilydjwg.me/
提问的智慧
Arch Linux 中文论坛

我的vimrc: https://git.io/vimrc


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 6 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:Bing [Bot] 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译