Привет, perl 5.10
пробую слать сообщения в UTF-8 используя как NET::XMPP так и NET::Jabber на jabber сервер (тестирую ejabberd и openfire), но на выходе клиента - кракозябры(тестирую gajim и qip под винду). клиент-клиент работает нормально.
Усложнял задачу перекодируя различный текст при помощи Text::Iconv и/или Convert::Cyrillic, всё равно кракозябры.В чём может быть дело?
да, забыл сам код по вопросу :)
$ echo $LANG
ru_RU.UTF-8$cat test.uft8.pl
#!/usr/bin/perl -w
use strict;
use Net::XMPP;
my $server = 'localhost';
my $port = '5222';
my $username = 'adm2';
my $password = '123';
my $resource = 'test';my $msg = 'русские буквы в UTF-8';
my $rcpt = 'adm@localhost';
my $type = 'headline';my $Connection = new Net::XMPP::Client();
$Connection->Connect(hostname=>$server, port=>$port);
$Connection->AuthSend(username=>$username, password=>$password, resource=>$resource);
$Connection->MessageSend('to' => $rcpt, 'type' => $type, '$subject' => '', 'body' => $msg);
$Connection->Disconnect();
use utf; попробуйте
>use utf; попробуйтев каком месте кода, если локаль в utf8?
>в каком месте кода, если локаль в utf8?Извините, чуть ошибся:
use utf8;Это специальная прагма: http://perldoc.perl.org/utf8.html
>$ echo $LANG
>ru_RU.UTF-8Системная локаль тут совершенно не при чем.
>my $msg = 'русские буквы в UTF-8';
Не-ascii строки в коде само по себе зло. Про use utf8 уже сказали, а вообще читайте их откуда должны читать.
>>$ 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, чтобы получить желаемый результат
оказалось всё просто, но довольно странно> $from=decode($3); $subj=decode($4); $to="$1\@localhost"; }
добавляю такие строки:
my $from1 = utf8::decode($from);
my $subj1 = utf8::decode($subj);>$Connection->MessageSend('to' => $to, 'type' => $type, 'subject' => $subj, 'body' => $from);
и заработало как надо, в любых локалях с любыми перекодировками. Правда так и не понял истинный смысл того, что сделал :)