Perl处理中文时出现乱码

leofengliang 2013-10-09 01:47:28
目前在用Perl(Linux环境下)做一个工具,目的是错误信息的多语言支持。即根据Error ID找到对应语言的字符串,用其替换文本文件中的英文字符串。目前西方语言支持没有问题,唯独中文和日文写入文本后是乱码。也上网搜索了相关解决方案,但没有解决问题。我的简要实现代码如下:

my $oCode = "UTF-8";
my $oFmtJ = Spreadsheet::ParseExcel::FmtUnicode->new(Unicode_Map => $oCode);
my $excel = Spreadsheet::ParseExcel::Workbook->Parse("$error_xls",$oFmtJ);

foreach my $sheet (@{$excel->{Worksheet}}) {
#printf("Sheet: %s\n", $sheet->{Name});
$sheet->{MaxRow} ||= $sheet->{MinRow};
foreach my $row ($sheet->{MinRow} .. $sheet->{MaxRow}) {
$sheet->{MaxCol} ||= $sheet->{MinCol};
my @array=();
foreach my $col ($sheet->{MinCol} .. $sheet->{MaxCol}) {
my $cell = $sheet->{Cells}[$row][$col];
if ($cell) {
push @array, $cell->{Val};
}
}
此时,$cell->{Val}如果读取的是中文,则为乱码。

请教各位大侠其中的原因?不胜感激。
...全文
442 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
leofengliang 2013-10-09
  • 打赏
  • 举报
回复
上面的代码贴乱了,重贴一次: 主要代码如下: #!/usr/bin/perl use strict; BEGIN { push @INC,'./Unicode/' }; use Unicode::Map; use Encode; use Spreadsheet::ParseExcel; use Spreadsheet::ParseExcel::FmtUnicode; print "Please enter the program name:"; $program=(<>;); chomp $program; print "Please enter the name of the other language:"; $language=(<>;); chomp $language; print "Please enter the excel file:"; $error_xls=(<>;); chomp $error_xls; if ( ! -f $error_xls ) { print "\nExcel file $error_xls doesn't exist. Exiting\n"; exit 1; } print "Please enter the column no. of the other language:"; $col=(<>;); chomp $col; # Directory of the di files to be translated $di_dir="/vobs/lx/language/$language/em"; $logfile = "lang_integ_${program}_${language}.log"; open(LANG,">$logfile"); print LANG "Program: $program\nLanguage: $language\nError Excel File: $error_xls\nColumn Number: $col\nDi File Directory: $di_dir\n\n"; my $var2; my $filename; my $errnum; my $errno; my $quote; my @covered; my $result; my $oCode = "CP936" my $oFmtJ = Spreadsheet::ParseExcel::FmtUnicode->new(Unicode_Map => $oCode); my $excel = Spreadsheet::ParseExcel::Workbook->;Parse("$error_xls",$oFmtJ); foreach my $sheet (@{$excel->{Worksheet}}) { #printf("Sheet: %s\n", $sheet->{Name}); $sheet->{MaxRow} ||= $sheet->{MinRow}; foreach my $row ($sheet->{MinRow} .. $sheet->{MaxRow}) { $sheet->{MaxCol} ||= $sheet->{MinCol}; my @array=(); foreach my $col ($sheet->{MinCol} .. $sheet->{MaxCol}) { my $cell = $sheet->{Cells}[$row][$col]; if ($cell) { push @array, $cell->{Val}; } } $filename = $array[0]; if ($filename =~ /di/){ $filename =~ s/((^\s+)||(\s+$))//g; $infile="$filename.tmp"; if ( ! -f "$di_dir/$infile" ) {`touch $di_dir/$infile; chmod 664 $di_dir/$infile; cp -f $di_dir/$filename $di_dir/$infile`;} $outfile="$filename.$language"; if ( ! -f "$di_dir/$outfile" ) {`touch $di_dir/outfile; chmod 664 $di_dir/$outfile`; } $errnum = $array[1]; #$array[$col-1] =~ s/\\@/\n/g; $var2 = $array[$col-1]; chomp $var2; chomp $array[2]; my @arr=($array[1],$var2,$array[2]); $check=`grep -h $errnum $di_dir/$filename`; chomp $check; print "\nProcessing filename: $filename, Error number: $errnum\n"; print LANG "\nProcessing filename: $filename, Error number: $errnum"; #print "\n$array[0]\n$array[1]\n$array[2]\n$array[3]\n$array[4]\n$array[5]\n$array[6]\n$array[7]\n$array[8]\n\n"; if($check) { open(IN,"<$di_dir/$infile"); open(OUT,">$di_dir/$outfile"); print LANG "\nError Number $errnum is there in file $filename\n"; while(<IN>;){chomp $_; if($_ =~ /^(\d){1,}$/){$var=""; $errno=$_; $var="$_\n";} if($_ !~ /^(\d){1,}$/){ if($_ !~ /^<.*>$/) { $var.="$_\n"; }} if($_ =~ /^<.*>$/) {$var.="$_\n"; if ($errno == $errnum) {print LANG "Error Number $errno updated.\n"; print OUT $array[1],"\n","\"",$var2,"\"","\n",$array[2],"\n";} else {print OUT "$var"; }} } close OUT; close IN; } else { print LANG "\nError Number $errnum is not there in file $filename\n"; `cp -f $di_dir/$infile $di_dir/$outfile`; open(OUT,">>$di_dir/$outfile"); print OUT $array[1],"\n","\"",$var2,"\"","\n",$array[2],"\n"; print LANG "Error Number $errnum Appended.\n"; close OUT; close IN; } `cp -f $di_dir/$outfile $di_dir/$infile`; } } } `rm -f $di_dir/*di.tmp`;
leofengliang 2013-10-09
  • 打赏
  • 举报
回复
主要代码如下: #!/usr/bin/perl use strict; BEGIN { push @INC,'./Unicode/' }; use Unicode::Map; use Encode; use Spreadsheet::ParseExcel; use Spreadsheet::ParseExcel::FmtUnicode; print "Please enter the program name:"; $program=(<>); chomp $program; print "Please enter the name of the other language:"; $language=(<>); chomp $language; print "Please enter the excel file:"; $error_xls=(<>); chomp $error_xls; if ( ! -f $error_xls ) { print "\nExcel file $error_xls doesn't exist. Exiting\n"; exit 1; } print "Please enter the column no. of the other language:"; $col=(<>); chomp $col; # Directory of the di files to be translated $di_dir="/vobs/lx/language/$language/em"; $logfile = "lang_integ_${program}_${language}.log"; open(LANG,">$logfile"); print LANG "Program: $program\nLanguage: $language\nError Excel File: $error_xls\nColumn Number: $col\nDi File Directory: $di_dir\n\n"; my $var2; my $filename; my $errnum; my $errno; my $quote; my @covered; my $result; my $oCode = "utf-8"; my $oFmtJ = Spreadsheet::ParseExcel::FmtUnicode->new(Unicode_Map => $oCode); my $excel = Spreadsheet::ParseExcel::Workbook->Parse("$error_xls",$oFmtJ); foreach my $sheet (@{$excel->{Worksheet}}) { #printf("Sheet: %s\n", $sheet->{Name}); $sheet->{MaxRow} ||= $sheet->{MinRow}; foreach my $row ($sheet->{MinRow} .. $sheet->{MaxRow}) { $sheet->{MaxCol} ||= $sheet->{MinCol}; my @array=(); foreach my $col ($sheet->{MinCol} .. $sheet->{MaxCol}) { my $cell = $sheet->{Cells}[$row][$col]; if ($cell) { push @array, $cell->{Val}; push @array, $str;#!/usr/bin/perl #use strict; BEGIN { push @INC,'./Unicode/' }; #use Unicode::Map; use Encode; use Spreadsheet::ParseExcel; use Spreadsheet::ParseExcel::FmtUnicode; print "Please enter the program name:"; $program=(<>); chomp $program; print "Please enter the name of the other language:"; $language=(<>); chomp $language; print "Please enter the excel file:"; $error_xls=(<>); chomp $error_xls; if ( ! -f $error_xls ) { print "\nExcel file $error_xls doesn't exist. Exiting\n"; exit 1; } print "Please enter the column no. of the other language:"; $col=(<>); chomp $col; # Directory of the di files to be translated $di_dir="/vobs/lx/language/$language/em"; $logfile = "lang_integ_${program}_${language}.log"; open(LANG,">$logfile"); print LANG "Program: $program\nLanguage: $language\nError Excel File: $error_xls\nColumn Number: $col\nDi File Directory: $di_dir\n\n"; my $var2; my $filename; my $errnum; my $errno; my $quote; my @covered; my $result; my $oCode = "UTF-8"; my $oFmtJ = Spreadsheet::ParseExcel::FmtUnicode->new(Unicode_Map => $oCode); # my $excel = Spreadsheet::ParseExcel::Workbook->Parse("$error_xls",$oFmtJ); my $excel = Spreadsheet::ParseExcel::Workbook->Parse("$error_xls"); foreach my $sheet (@{$excel->{Worksheet}}) { #printf("Sheet: %s\n", $sheet->{Name}); $sheet->{MaxRow} ||= $sheet->{MinRow}; foreach my $row ($sheet->{MinRow} .. $sheet->{MaxRow}) { $sheet->{MaxCol} ||= $sheet->{MinCol}; my @array=(); foreach my $col ($sheet->{MinCol} .. $sheet->{MaxCol}) { my $cell = $sheet->{Cells}[$row][$col]; if ($cell) { push @array, $cell->{Val}; } } $filename = $array[0]; if ($filename =~ /di/){ $filename =~ s/((^\s+)||(\s+$))//g; $infile="$filename.tmp"; if ( ! -f "$di_dir/$infile" ) {`touch $di_dir/$infile; chmod 664 $di_dir/$infile; cp -f $di_dir/$filename $di_dir/$infile`;} $outfile="$filename.$language"; if ( ! -f "$di_dir/$outfile" ) {`touch $di_dir/outfile; chmod 664 $di_dir/$outfile`; } $errnum = $array[1]; #$array[$col-1] =~ s/\\@/\n/g; $var2 = $array[$col-1]; chomp $var2; chomp $array[2]; my @arr=($array[1],$var2,$array[2]); $check=`grep -h $errnum $di_dir/$filename`; chomp $check; print "\nProcessing filename: $filename, Error number: $errnum\n"; print LANG "\nProcessing filename: $filename, Error number: $errnum"; #print "\n$array[0]\n$array[1]\n$array[2]\n$array[3]\n$array[4]\n$array[5]\n$array[6]\n$array[7]\n$array[8]\n\n"; if($check) { open(IN,"<$di_dir/$infile"); open(OUT,">$di_dir/$outfile"); print LANG "\nError Number $errnum is there in file $filename\n"; while(<IN>){chomp $_; if($_ =~ /^(\d){1,}$/){$var=""; $errno=$_; $var="$_\n";} if($_ !~ /^(\d){1,}$/){ if($_ !~ /^<.*>$/) { $var.="$_\n"; }} if($_ =~ /^<.*>$/) {$var.="$_\n"; if ($errno == $errnum) {print LANG "Error Number $errno updated.\n"; print OUT $array[1],"\n","\"",$var2,"\"","\n",$array[2],"\n";} else {print OUT "$var"; }} } close OUT; close IN; } else { print LANG "\nError Number $errnum is not there in file $filename\n"; `cp -f $di_dir/$infile $di_dir/$outfile`; open(OUT,">>$di_dir/$outfile"); print OUT $array[1],"\n","\"",$var2,"\"","\n",$array[2],"\n"; print LANG "Error Number $errnum Appended.\n"; close OUT; close IN; } `cp -f $di_dir/$outfile $di_dir/$infile`; } } } `rm -f $di_dir/*di.tmp`; } } $filename = $array[0]; if ($filename =~ /di/){ $filename =~ s/((^\s+)||(\s+$))//g; $infile="$filename.tmp"; if ( ! -f "$di_dir/$infile" ) {`touch $di_dir/$infile; chmod 664 $di_dir/$infile; cp -f $di_dir/$filename $di_dir/$infile`;} $outfile="$filename.$language"; if ( ! -f "$di_dir/$outfile" ) {`touch $di_dir/outfile; chmod 664 $di_dir/$outfile`; } $errnum = $array[1]; #$array[$col-1] =~ s/\\@/\n/g; $var2 = $array[$col-1]; chomp $var2; chomp $array[2]; my @arr=($array[1],$var2,$array[2]); $check=`grep -h $errnum $di_dir/$filename`; chomp $check; print "\nProcessing filename: $filename, Error number: $errnum\n"; print LANG "\nProcessing filename: $filename, Error number: $errnum"; #print "\n$array[0]\n$array[1]\n$array[2]\n$array[3]\n$array[4]\n$array[5]\n$array[6]\n$array[7]\n$array[8]\n\n"; if($check) { open(IN,"<$di_dir/$infile"); open(OUT,">$di_dir/$outfile"); print LANG "\nError Number $errnum is there in file $filename\n"; while(<IN>){chomp $_; if($_ =~ /^(\d){1,}$/){$var=""; $errno=$_; $var="$_\n";} if($_ !~ /^(\d){1,}$/){ if($_ !~ /^<.*>$/) { $var.="$_\n"; }} if($_ =~ /^<.*>$/) {$var.="$_\n"; if ($errno == $errnum) {print LANG "Error Number $errno updated.\n"; print OUT $array[1],"\n","\"",$var2,"\"","\n",$array[2],"\n";} else {print OUT "$var"; }} } close OUT; close IN; } else { print LANG "\nError Number $errnum is not there in file $filename\n"; `cp -f $di_dir/$infile $di_dir/$outfile`; open(OUT,">>$di_dir/$outfile"); print OUT $array[1],"\n","\"",$var2,"\"","\n",$array[2],"\n"; print LANG "Error Number $errnum Appended.\n"; close OUT; close IN; } `cp -f $di_dir/$outfile $di_dir/$infile`; } } } `rm -f $di_dir/*di.tmp`;
leofengliang 2013-10-09
  • 打赏
  • 举报
回复
push @array, $cell->{Val}; 调试时,在这句之后,P $cell->{Val},显示乱码。 当然,写入到文本后,也是乱码。
panghuhu250 2013-10-09
  • 打赏
  • 举报
回复
乱码是什么时候观察到的:写入文件时,输出到屏幕时,还是其他?相关的代码?
leofengliang 2013-10-09
  • 打赏
  • 举报
回复
您的意思是将my $oFmtJ = Spreadsheet::ParseExcel::FmtUnicode->new(Unicode_Map => $oCode); 替换为my $oFmtJ = Spreadsheet::ParseExcel::FmtJapan->new(); ?? 另外,我还真的不知道怎样查看Excel中字符是以什么形式存放的?
iasky 2013-10-09
  • 打赏
  • 举报
回复
execl中是utf-8存放的么? Spreadsheet::ParseExcel::FmtJapan->new();
leofengliang 2013-10-09
  • 打赏
  • 举报
回复
没有人能回答吗?

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧