The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Допилить скрипт"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Perl)
Изначальное сообщение [ Отслеживать ]

"Допилить скрипт"  +/
Сообщение от Alting email(ok) on 18-Янв-11, 13:41 
Уважаемые программеры!
На просторах интернета наткнулся на такой скрипт:

#!/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
Понимаю, что для гуру вопрос выеденного гроша :) не стоит, но я не спец в перле...

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Допилить скрипт"  +/
Сообщение от XAnder (ok) on 18-Янв-11, 16:48 
> Все бы хорошо, но русские буквы приходят кракозяблами :(

Можно попробовать для начала конвертнуть этот скрипт в какую-нибудь однобайтную кодировку (cp1251?) и посмотреть результат. Судя по "ругани", у вас сейчас юникод. Если не поможет, читайте дальше :-)

> 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);

Русские буквы станут парами байт. Не факт, что проблему решите, но от ругани избавитесь.

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "Допилить скрипт"  +/
Сообщение от Alting email(ok) on 18-Янв-11, 17:00 
>[оверквотинг удален]
> Если не поможет, читайте дальше :-)
>> 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=
От ругани-то я избавился, а вот как от кракозяблов-то избавиться? :)


Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "Допилить скрипт"  +/
Сообщение от XAnder (ok) on 18-Янв-11, 18:02 
> От ругани-то я избавился, а вот как от кракозяблов-то избавиться? :)

Подобрать кодировку? Чисто методом тыка. Шут его знает, какая из них аське нужна - если не ошибаюсь, у неё с кодировками проблемы хронические. Поищите какую-нибудь документацию по протоколу OSCAR, может в ней что-нибудь полезное отыщете.

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

4. "Допилить скрипт"  +/
Сообщение от Alting email(ok) on 19-Янв-11, 08:15 
>> От ругани-то я избавился, а вот как от кракозяблов-то избавиться? :)
> Подобрать кодировку? Чисто методом тыка. Шут его знает, какая из них аське
> нужна - если не ошибаюсь, у неё с кодировками проблемы хронические.
> Поищите какую-нибудь документацию по протоколу OSCAR, может в ней что-нибудь полезное
> отыщете.

Да уже все "перетыкал", тупой протокол этот OSCAR!
То ли дело джаббер :)

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

5. "Допилить скрипт"  +/
Сообщение от NuINu (??) on 27-Янв-11, 22:31 
>>> От ругани-то я избавился, а вот как от кракозяблов-то избавиться? :)
>> Подобрать кодировку? Чисто методом тыка. Шут его знает, какая из них аське
>> нужна - если не ошибаюсь, у неё с кодировками проблемы хронические.
>> Поищите какую-нибудь документацию по протоколу 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();
}

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

6. "Допилить скрипт"  +/
Сообщение от Alting email(ok) on 28-Янв-11, 09:34 
>[оверквотинг удален]
>     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";

что это?

Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

7. "Допилить скрипт"  +/
Сообщение от NuINu (??) on 28-Янв-11, 14:35 
>[оверквотинг удален]
>> while (1)
>> {
>>     $oscar->do_one_loop();
>> }
> У меня все в UTF-8. Попробовал тупо в Вашем скрипте заменить KOI-8
> на UTF-8, выдает теперь в ответ на сообщение: "юя / "
> :)
> вот это вот меня смутило:
> my $decode_prefics = "\xFE\xFF";
> что это?

этот префикс используется только для декодирования ПОЛУЧЕННЫХ сообщений.
те если вам надо распечатать полученное сообщение его надо декодировать из UTF16
незнаю как везде у меня перл 5.8 и модуль Encode требует его использования. иначе не воспринимает текст.

кстати он(префикс) скорее всего присутствует в подготовленом к отправке сообщениях(выведите его в файл и посмотрите), возможно его надо отрезать. но этот вопрос я не изучал, тк повторюсь, у моего друга QIP2000 все работает, а больше я ни с кем не экспериментировал.

Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру