perl遍历文件夹将文件转化为utf-8格式

制作需求来源

用eclipse打开网站源码,发现java代码中文乱码,想都不用想,文件格式肯定不是utf-8(因为以前我用notepad++看过),这次我实在是不想手动改了,就用perl处理了,搜了资料,做了3个小时才搞定,为什么我总是这么慢。

bug报告:

1)程序检测到是utf-8所以不转换,把程序下面if语句的四行注释掉试试。

if(detect($line) eq "UTF-8") 



代码的可用之处

1)有个可以获得文件夹中所有文件的函数(包括递归子文件夹)

        2)提供正则表达式,将gb2312的文件批量转为utf-8格式的文件。

下面是代码(居然没提供perl的格式):

#!perl -w
use Encode;
use Encode::CN;
use Encode::Detect::Detector;
=pod
 windows中安装这个模块,先进入perl/bin下面,运行cpan一开始估计要安装gcc
 然后install Encode::Detect::Detector 就会连网查找。
 好像之前我还先 输入命令 m 才可以。
 ppm 本应该也可以但是这次不行
 
=cut
use Win32::File;



sub pt{#仅仅是为了调试
    print "@_"."\n";
}
sub gainFilesFromPath{
    #第一个为文件夹路径,第二个为正则表达式,不提供则显示所有文件 返回是文件数组,绝对路径。
    #大致就是利用广度搜索,遍历所有文件夹
    my($path,$pattern)=@_;
    my @files;
    my $handle,my $subname; #定义要这样
    #pt($path.$pattern);
    if(not -d $path) {
        return "false";
    }
    if(not opendir($handle,$path)){
        return "false";
    }
    my (@dirs,$dir); #定义要这样
    $dirs[0]=$path;
    while($dir=shift @dirs){
       # pt($dir);
        if(opendir($handle,$dir)){
            while($subname=readdir($handle)){
                my $tmp=$subname;
                $subname=$dir."/".$subname;
                #pt($subname);
                if(-d $subname){
                    #pt($tmp);
                    if($tmp eq "." or $tmp eq ".."){ #~/\.*/ 这样居然不行
                    }else{
                        unshift @dirs,$subname;#保存目录
                    }
                    #next;
                }else {
                    if(defined($pattern) and $pattern ne "" ){
                        if($subname =~ m/$pattern/){
                            #pt($subname);
                            unshift @files,$subname;
                        }
                    }else{
                        unshift @files,$subname;
                    }
                }
            }
        }
        #NEXTDIR:
    }
    pt(scalar(@files));
    return @files;
}
sub to_utf_8(@){  #也没什么就是函数原型 类似还有$$  函数里面这段代码是网上找的,网址没记下来,很不好意思。
    foreach my $file (@_) {
        my $attr;
        Win32::File::GetAttributes($file, $attr);
        my $flag = 1;
        my $newfile = $file.".tmp";
        open OLD, $file or die "open $file failed: $!";
        open NEW, ">$newfile" or die "open $newfile failed: $!";
        while (my $line = <OLD>) {
            if(detect($line) eq "UTF-8") {
                $flag = 0;
                last;
            }
            $line = decode("gb2312", $line);
            print NEW encode("utf8", $line);
        }
        close OLD;
        close NEW;
        if($flag == 1) {
            unlink $file;
            rename $newfile, $file;
            Win32::File::SetAttributes($file, $attr)
                or die "set attribute failed: $!";
            print "$file change to utf8\n";
        } else {
            unlink $newfile;
            print "$file no change\n";
        }
    }
}

#下面就开始执行了,单引号是为了不转意  当然后面也可以用单引号,这样就不用两个 \ 了
to_utf_8 gainFilesFromPath('E:\programmingImple\jsp\code\meituan',"\\.java\$");


你可能感兴趣的:(perl,乱码)