>>$ echo $LANG
>>ru_RU.UTF-8
>
>Системная локаль тут совершенно не при чем.
>
>>my $msg = 'русские буквы в UTF-8';
>
>Не-ascii строки в коде само по себе зло. Про use utf8 уже
>сказали, а вообще читайте их откуда должны читать. хм.. я недавно изучаю perl, и наверно двигаюсь в неверном направлении?
расскажу более детально:
syslog-ng на определённый лог стандартного cyrus/notifyd вызывает скрипт(который делаю), который делает перекодирование лога и отправку сообщения о доставке письма:
May 7 13:29:10 s004 notifyd[25420]: MAIL, , test1, INBOX, "From:
=?UTF-8?B?0KLQtdGB0YLQuNGA0YPRjtGJ0LjQuSDQvtGC0L/RgNCw0LLQuNGC0LXQuw==?= =?UTF-8?B?0Yw=?= <test0@localhost> Subject: [Fwd: =?UTF-8?B?0L/RgNC+0LLQtdGA0LrQsCDRgdCy0Y/Qt9C4XQ==?= To: =?UTF-8?B?0J/QvtC70YPRh9Cw0YLQtdC70Yw=?= <test1@localhost> "
Вот сам код, пока обрабатывается лог из файла:
#!/usr/bin/perl -w
use Net::XMPP;
use MIME::Words qw(:all);
use Convert::Cyrillic;
use strict;
my $server = 'localhost'; my $port = '5222'; my $username = 'testfrom'; my $password = 'password';
my $resource = 'testxmpp';my $type = 'headline'; my $string; my $to; my $subj; my $from;
open FILE,"notify.log";
while (<FILE>){
if (/^.*MAIL\,.*\,\s(.*.)\,(.*.)\,.*From\:\s(.*.)\sSubject\:\s(.*.)\sTo\:.*.$/) {
$from=decode($3); $subj=decode($4); $to="$1\@localhost"; }
my $Connection = new Net::XMPP::Client();
my $status = $Connection->Connect(hostname=>$server, port=>$port);
if (!(defined($status))) { print "ERROR: Jabber server is down or connection was not allowed.\n";
exit(0); }
my @result = $Connection->AuthSend(username=>$username, password=>$password, resource=>$resource);
if ($result[0] ne "ok") { print "ERROR: Authorization failed: $result[0] - $result[1]\n";
exit(0); }
$Connection->MessageSend('to' => $to, 'type' => $type, 'subject' => $subj, 'body' => $from);
$Connection->Disconnect();
}
close FILE;
sub decode{
my ($s)=@_;
my $decoded = join("", map {xcode(${$_}[1], ${$_}[0])} decode_mimewords($s));
return $decoded;
}
sub xcode {
my ($charset, $src) = @_;
my %charsets = (
'windows-1251'=>'WIN',
'iso8859-5'=>'ISO',
'koi8-r'=>'KOI8',
'koi8r'=>'KOI8',
'koi8-u'=>'KOI8',
'utf-8'=>'UTF8',
'utf8'=>'UTF8'
);
return $src unless ($charsets{lc($charset)});
Convert::Cyrillic::cstocs($charsets{lc($charset)}, 'UTF8', $src);
}
В консоли всё выглядит замечательно, но немогу понять, что нужно с use utf8, чтобы получить желаемый результат