我们安装了一个ASSP (反垃圾邮件SMTP代理) v2.3.3.13217 (最后一个)(在UbuntuServer13.04上)。过了一段时间,它开始在控制台上打印:
...
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: $@";
} else {
eval{
Encode::from_to($line,'UTF-8',$ConsoleCharset,sub { return '?'; })
if $ConsoleCharset && $ConsoleCharset !~ /utf-?8/oi;
1;
} or print "con encoding error: $@";
}
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。这里的错误在哪里?
Full assp.pl在13217.zip
发布于 2013-10-03 06:28:35
此错误通常表示您已将一个非ASCII字符输出到文件句柄(如STDOUT),该文件句柄并不期望它。
一个快速而肮脏的修复方法是将no warnings 'utf8';添加到违规的print语句上方的行中。正确的解决方案是确保以正确的模式打开文件句柄。
发布于 2013-10-03 09:50:38
我在这里的回答将解释发生了什么。
我不认为仅仅关闭警告(正如您接受的答案中所建议的)是一个非常好的解决方案。您应该确保您的输出文件句柄期望您正在使用的输出编码中的数据。
如果您总是处理UTF8输出,那么-C命令行开关是设置标准文件句柄(STDIN、STDOUT和STDERR)以期待UTF8 (详见perldoc perlrun )的一种快速简便的方法。但是看起来您有一个名为$ConsoleCharset的变量,它包含预期输出编码的名称。因此,您可能可以使用联模函数将STDOUT设置为正确的编码。
binmode STDOUT, ":encoding($ConsoleCharset)";Perl中的字符集支持是一个复杂但重要的领域。忽视错误只是为未来积累了更多的痛苦。
https://stackoverflow.com/questions/19152033
复制相似问题