制作需求来源:
用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\$");