用Perl实现一个批量文件转码工具

来源:互联网 发布:云计算应用案例有哪些 编辑:程序博客网 时间:2024/06/05 17:38

前几天在看Ultimate_ToolBox的源代码,从codeproject上down下来一编译,一堆错误,发现是由于编译器无法识别ISO-8859-1编码,误读有关字符造成的,所以立即着手准备转换程序源文件编码,google了一把,也下了两个小软件,但是都没有批量转换功能,而有这功能的又不支持从ISO-8859-1到UTF-8的转换,于是想到从前在FreeBSD下UTF-8和GB2312互相转换的函数的iconv库,我知道iconv不但是一个程序库,而且有一个同名的应用程序能够将文件在两种编码中转换。用这个iconv程序搭配脚本再利用重定向功能应该可以很轻松地完成批量转换文件编码的工作。

在实际编写脚本的过程中,害怕将来运行出现意外,所以并没有将转码过后的文件重定向到源文件上,而是指定了另外一个位置,同时为了将来对Ultimate_ToolBox整个代码编译的方便,对工程目录中不用进行编码的文件,全部原样拷贝到新的位置,这样一个递归遍历目录,批量转换文件编码的小工具就诞生了。

附上Perl的源程序,如果windows下有已经移植过的iconv,则搭配ActivPerl也可以运行在windows环境下。

 

#!/cygdrive/c/Perl/bin/perl
#######################################################
#用途:    批量转换某文件夹内程序源文件的编码,其余文件不变
#
#用法:    $./change_codepage.pl > log.txt
#
#Author:    Changhailong
#
#E-mail:    hailongchang165210@gmail.com
#######################################################

use File::Find;
use File::Copy;
use File::Path/make_path/;

#在这里指定需要转换codepage源文件的目录
$source_dir="d:/temp_code/ultimate_tools";

#在这里指定目标目录
$destination_dir="d:/temp_code/pp";

find(/&traverse,$source_dir);

sub traverse()
{
    my $file=$File::Find::name;

    my $df =$file;
    $df =~ s//Q$source_dir/E/$destination_dir/g;
   
    print("source: $file/n");
    print("destination:$_/n");
    if(-d $_)
    {
        if(-e $df)#如果目录已经存在,继续递归遍历
        {
            print("The directory has been exist:$df/n");
            last;
        }
        else#如果目录不存在,则创建目录
        {
            print("It is a directory, create:$df/n");
            File::Path::make_path($df);
        }
    }
    else
    {
        if(//.cpp$|/.h$|/.c$|/.inl$/i)#这里用正则表达式指定需要转换编码的文件类型
        {
            my $cmd = "iconv -f ISO-8859-1 -t UTF-8  </"$file/"  >/"$df/"";    #将ISO-8859-1转换为UTF-8
            print "$cmd/n";
            system $cmd;
        }
        else#若不是需要转换编码的文件类型,拷贝到新的位置
        {
                print("copy $file to $df/n");
                copy($file,$df) or die "copy failed: $!/n";
        }
    }

    print("/n/n/n");
}