2013-10-03 18 views
0

我們安裝了一個ASSP(反垃圾郵件SMTP代理)v2.3.3.13217(最後一個)(在Ubuntu Server 13.04上)。經過一段時間它開始在控制檯打印:在主打印中的寬字符::第30行的mlogWrite(ASSP)

... 
Wide character in print at sub main::mlogWrite line 30 
Wide character in print at sub main::mlogWrite line 32 
Wide character in print at sub main::mlogWrite line 30 
Wide character in print at sub main::mlogWrite line 32 
... 

依此類推。

下面是來自assp.pl此子:

sub mlogWrite { 
    return if $WorkerNumber; 
    my @m; 
    my $items; 
    threads->yield(); 
    &debugWrite(); 
    threads->yield; 
    $items = $mlogQueue->pending(); 
    $refreshWait = (time - $lastmlogWrite) > 5 ? 5 : 1; 
    return if (! $items); 
    threads->yield(); 
    @m = $mlogQueue->dequeue_nb($items); 
    threads->yield(); 
    my @tosyslog; 
    while (@m) { 
     my $logline = my $line = de8(shift @m); 
     if ($Unidecode2Console) { 
      eval{ 
       $line = Text::Unidecode::unidecode($line); 
      } or print "con uni-decoding error: [email protected]"; 
     } else { 
      eval{ 
       Encode::from_to($line,'UTF-8',$ConsoleCharset,sub { return '?'; }) 
        if $ConsoleCharset && $ConsoleCharset !~ /utf-?8/oi; 
       1; 
      } or print "con encoding error: [email protected]"; 
     } 
     push @tosyslog,substr($line,length($LogDateFormat)) if ($sysLog && ($CanUseSyslog || ($sysLogPort && $sysLogIp))); 
     if ($line !~ /\*\*\*assp\&is\%alive\$\$\$/o) { 
      print $line unless ($silent); 
      w32dbg($line) if ($CanUseWin32Debug); 
      print $LOG $logline if ($logfile && $asspLog && fileno($LOG)); 
      print $LOGBR $logline if ($logfile && 
            $asspLog && 
            fileno($LOGBR) && 
            $ExtraBlockReportLog && 
            $logline =~ /\[\s*spam\sfound\s*\]/io); 
     } 
     if ($logline !~ /page:\/maillog/o) { 
      shift @RealTimeLog if (@RealTimeLog > 33); 
      push @RealTimeLog, $logline; 
      $lastmlogWrite = time; 
     } 
    } 
    tosyslog('info', \@tosyslog) if (@tosyslog && $sysLog && ($CanUseSyslog || ($sysLogPort && $sysLogIp))); 
    $MainThreadLoopWait = 1; 
} 

我非常非常抱歉,但我不知道的Perl。這裏的錯誤在哪裏?

完全assp.pl是http://sourceforge.net/projects/assp/files/ASSP%20V2%20multithreading/2.3.3%2013217/ASSP_2.3.3_13217.zip

+1

http://stackoverflow.com/a/15222005/223226 –

回答

4

這個錯誤通常表明你已經輸出了非ASCII字符的文件句柄(如STDOUT)以未預料到一個文件句柄。

一個快速而髒的修復方法是將no warnings 'utf8';添加到違規打印語句上方的行。正確的解決方案是確保文件句柄以正確的模式打開。

+0

謝謝,它幫助:-) – vladon

3

My answer here將解釋發生了什麼。

我不認爲只是關閉警告(正如您接受的答案中所建議的)是一個非常好的解決方案。你應該確保你的輸出文件句柄需要你正在使用的輸出編碼中的數據。

如果您總是處理UTF8輸出,那麼-C命令行開關是一種快速簡便的方法,可將標準文件句柄(STDIN,STDOUT和STDERR)設置爲期望UTF8(詳情請參見perldoc perlrun)。但它看起來像你有一個名爲$ConsoleCharset的變量,其中包含預期輸出編碼的名稱。因此,您可以使用binmode函數將STDOUT設置爲正確的編碼。

binmode STDOUT, ":encoding($ConsoleCharset)"; 

Perl中的字符集支持是一個複雜而重要的領域。忽略錯誤只是爲未來儲存更多的痛苦。

+0

我發現參數控制檯字符集在ASSP管理站點,它被設置爲「系統默認」, 我跑'echo $ LANG'並得到了'en_US.UTF-8',所以我把var改成了「utf8」,並且警告消失了。 非常感謝! – vladon

+0

Upd。一些警告消失了,以前他們很常見,現在他們很少,但也顯示:-( – vladon

+0

所以,我發現線'我們的$ Unidecode2Console = 0;#(0/1)使用Text :: Unidecode來解碼NONASCII字符到ASCII - 如果可用 - 如果設置 - 'ConsoleCharset'被忽略'並將其設置爲1,警告完全消失謝謝提示! – vladon