perl遍历文件夹将文件转化为utf-8格式
发布时间:2020-12-15 23:50:23 所属栏目:大数据 来源:网络整理
导读:制作需求来源 : 用eclipse打开网站源码,发现java代码中文乱码,想都不用想,文件格式肯定不是utf-8(因为以前我用notepad++看过),这次我实在是不想手动改了,就用perl处理了,搜了资料,做了3个小时才搞定,为什么我总是这么慢。 bug报告: 1)程序检测
制作需求来源:
用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 utf8n"; } else { unlink $newfile; print "$file no changen"; } } } #下面就开始执行了,单引号是为了不转意 当然后面也可以用单引号,这样就不用两个 了 to_utf_8 gainFilesFromPath('E:programmingImplejspcodemeituan',".java$"); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |