Уважаемые программеры!
На просторах интернета наткнулся на такой скрипт:#!/usr/bin/perl
use Net::OSCAR qw(:standard);
exit if fork;
$uin = "1234567890";
$password = "**********";sub im_in
{
my($oscar, $sender, $message, $is_away) = @_;
print "[AWAY] " if $is_away;
$oscar->send_im($sender, "Я больше не использую ICQ. Для связи со мной используйте
Jabber [http://www.jabber.ru]. Мой JID аккаунт xxxxxx\@jabber.ru. Удачи!");
}$oscar = Net::OSCAR->new();
$oscar->set_callback_im_in(\&im_in);
$oscar->signon($uin, $password);while (true)
{
$oscar->do_one_loop();
}Висит в вашем аськином аккаунте и сообщает, что вы перешли на джаббер.
Все бы хорошо, но русские буквы приходят кракозяблами :(
use utf-8 не помогает - идет ругань:
Wide character in syswrite at /usr/lib/perl5/site_perl/5.10.1/Net/OSCAR/Connection.pm line 144
Понимаю, что для гуру вопрос выеденного гроша :) не стоит, но я не спец в перле...
> Все бы хорошо, но русские буквы приходят кракозяблами :(Можно попробовать для начала конвертнуть этот скрипт в какую-нибудь однобайтную кодировку (cp1251?) и посмотреть результат. Судя по "ругани", у вас сейчас юникод. Если не поможет, читайте дальше :-)
> use utf-8 не помогает - идет ругань:
> Wide character in syswrite at /usr/lib/perl5/site_perl/5.10.1/Net/OSCAR/Connection.pm
> line 144syswrite ждёт строку байт, а получает строку символов, не все из которых байты, ибо юникод. Можно эту строку предварительно преобразовать в "байтовую". Для этого пользуйтесь функцией utf8::encode:
$s = "Я больше не использую ICQ..."; utf8::encode($s);
Русские буквы станут парами байт. Не факт, что проблему решите, но от ругани избавитесь.
>[оверквотинг удален]
> Если не поможет, читайте дальше :-)
>> use utf-8 не помогает - идет ругань:
>> Wide character in syswrite at /usr/lib/perl5/site_perl/5.10.1/Net/OSCAR/Connection.pm
>> line 144
> syswrite ждёт строку байт, а получает строку символов, не все из которых
> байты, ибо юникод. Можно эту строку предварительно преобразовать в "байтовую". Для
> этого пользуйтесь функцией utf8::encode:
> $s = "Я больше не использую ICQ..."; utf8::encode($s);
> Русские буквы станут парами байт. Не факт, что проблему решите, но от
> ругани избавитесь.Да у меня юникод.
Скрипт запускаю с локали на своем же ноуте, и отправляю ему сообщение из qutim
В 1251 преобразовывать пробовал - "другие кракозяблы" :)
locale
LANG=ru_RU.UTF-8
LC_CTYPE=ru_RU.UTF-8
LC_NUMERIC=ru_RU.UTF-8
LC_TIME=ru_RU.UTF-8
LC_COLLATE=ru_RU.UTF-8
LC_MONETARY=ru_RU.UTF-8
LC_MESSAGES=ru_RU.UTF-8
LC_PAPER=ru_RU.UTF-8
LC_NAME=ru_RU.UTF-8
LC_ADDRESS=ru_RU.UTF-8
LC_TELEPHONE=ru_RU.UTF-8
LC_MEASUREMENT=ru_RU.UTF-8
LC_IDENTIFICATION=ru_RU.UTF-8
LC_ALL=
От ругани-то я избавился, а вот как от кракозяблов-то избавиться? :)
> От ругани-то я избавился, а вот как от кракозяблов-то избавиться? :)Подобрать кодировку? Чисто методом тыка. Шут его знает, какая из них аське нужна - если не ошибаюсь, у неё с кодировками проблемы хронические. Поищите какую-нибудь документацию по протоколу OSCAR, может в ней что-нибудь полезное отыщете.
>> От ругани-то я избавился, а вот как от кракозяблов-то избавиться? :)
> Подобрать кодировку? Чисто методом тыка. Шут его знает, какая из них аське
> нужна - если не ошибаюсь, у неё с кодировками проблемы хронические.
> Поищите какую-нибудь документацию по протоколу OSCAR, может в ней что-нибудь полезное
> отыщете.Да уже все "перетыкал", тупой протокол этот OSCAR!
То ли дело джаббер :)
>>> От ругани-то я избавился, а вот как от кракозяблов-то избавиться? :)
>> Подобрать кодировку? Чисто методом тыка. Шут его знает, какая из них аське
>> нужна - если не ошибаюсь, у неё с кодировками проблемы хронические.
>> Поищите какую-нибудь документацию по протоколу OSCAR, может в ней что-нибудь полезное
>> отыщете.
> Да уже все "перетыкал", тупой протокол этот OSCAR!
> То ли дело джаббер :)есть мнение что сообщения надо кодировать в UTF16. не могу отвечать за то что все смогут прочитать это сообщение но мой друг нормально видит русский текст ) надеюсь что результаты ваших экспериментов это тоже подтвердят.
итак, русский текст в моей программе написан в кои8р и локаль у меня кои8р:
#!/usr/bin/perl -w
use Net::OSCAR qw(:standard);
use Encode;
use Data::Dumper;
use strict;sub to_icq {
return encode("UTF16", decode("koi8-r", shift));
}sub from_icq {
return encode("koi8-r", decode("UTF16", shift));
}my $uin = "11111111111";
my $password = "xxxxxxxxxxx";
my $oscar;
my $decode_prefics = "\xFE\xFF";
my $mess1 = "Я больше не использую ICQ. Для связи со мной используйте Jabber [http://www.jabber.ru]. Мой JID аккаунт NuINu\@jabber.ru. Удачи!";
my $mess2 = to_icq($mess1);sub im_in
{
my($oscar, $sender, $message, $is_away) = @_;
print "Get from $sender: ". from_icq($decode_prefics.$message) ."\n";
$oscar->send_im($sender, $mess2);
}$oscar = Net::OSCAR->new();
$oscar->set_callback_im_in(\&im_in);
$oscar->signon($uin, $password);
while (1)
{
$oscar->do_one_loop();
}
>[оверквотинг удален]
> print "Get from $sender: ". from_icq($decode_prefics.$message) ."\n";
> $oscar->send_im($sender, $mess2);
> }
> $oscar = Net::OSCAR->new();
> $oscar->set_callback_im_in(\&im_in);
> $oscar->signon($uin, $password);
> while (1)
> {
> $oscar->do_one_loop();
> }У меня все в UTF-8. Попробовал тупо в Вашем скрипте заменить KOI-8 на UTF-8, выдает теперь в ответ на сообщение: "юя / " :)
вот это вот меня смутило:
my $decode_prefics = "\xFE\xFF";
что это?
>[оверквотинг удален]
>> while (1)
>> {
>> $oscar->do_one_loop();
>> }
> У меня все в UTF-8. Попробовал тупо в Вашем скрипте заменить KOI-8
> на UTF-8, выдает теперь в ответ на сообщение: "юя / "
> :)
> вот это вот меня смутило:
> my $decode_prefics = "\xFE\xFF";
> что это?этот префикс используется только для декодирования ПОЛУЧЕННЫХ сообщений.
те если вам надо распечатать полученное сообщение его надо декодировать из UTF16
незнаю как везде у меня перл 5.8 и модуль Encode требует его использования. иначе не воспринимает текст.кстати он(префикс) скорее всего присутствует в подготовленом к отправке сообщениях(выведите его в файл и посмотрите), возможно его надо отрезать. но этот вопрос я не изучал, тк повторюсь, у моего друга QIP2000 все работает, а больше я ни с кем не экспериментировал.