制作需求来源:
用eclipse打开网站源码,发现java代码中文乱码,想都不用想,文件格式肯定不是utf-8(因为以前我用notepad++看过),这次我实在是不想手动改了,就用perl处理了,搜了资料,做了3个小时才搞定,为什么我总是这么慢。
bug报告:
1)程序检测到是utf-8所以不转换,把程序下面if语句的四行注释掉试试。
if(detect($line) eq "UTF-8")
代码的可用之处:
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\$");