![]() |
Модераторы: ginnie, korob2001 |
![]() ![]() ![]() |
|
kain76 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 3.7.2007 Репутация: нет Всего: нет |
Добрый день.
Не могу разобраться с Encode вытаскиваю тело СМС-сообщения из GSM-модема и дальше при выводе тела в файл или в ст.выход вижу собщение "Wide character in subroutine entry at C:/Perl/lib/Encode.pm line 182, <DATA> line 164."... ну и выводит естественно всякую билиберду и символов в ней, естественно, ровно в 2 раза больше, чем в отправленном на модем смс-сообщении. Сразу говорю что это под WinXP (ActivePerl 5.8). Я установил все примочки для Encode и далее не могу понять как этим пользоваться. В конечном итоге нужно раскодировать Unicode (UCS-2) в cp1251. Буду благодарен за кусок кода ![]() ![]() |
|||
|
||||
nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 2 Всего: 84 |
это какие? Он и в своём "изначальном" виде прекрасный инструмент... Вы или процитируйте сообщение, или вложите файл, который надо "раскодировать" ;) Добавлено через 2 минуты и 34 секунды тут слишком много раз обсуждалось - так что можете воспользоваться "Поиском" на форуме, думаю достаточно ввести Encode Ещё есть неплохая фича вот по этому адресу (она кстати, выводится уже при создании темы, чтобы могли сразу найти ответ, вдруг вопрос поднимался уже) смотреть тут - http://forum.vingrad.ru/forum/topic-161775...845/0.html#look |
|||
|
||||
sharq |
|
|||
![]() Perl Liker ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 13.12.2004 Где: Ростов-на-Дону Репутация: 3 Всего: 28 |
kain76, функция decode тебе поможет
![]() -------------------- [color=gray]There's More Than One Way To Do It[/color] |
|||
|
||||
GoodBoy |
|
|||
![]() Главный джедай ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3886 Регистрация: 8.1.2003 Где: КМВ Репутация: нет Всего: 83 |
|
|||
|
||||
nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 2 Всего: 84 |
GoodBoy, sharq, тут слишком много про это говорилось... я бы сказал больше, но сам уже "тыщу" раз отвечал... пусть научится пользоваться поиском, он ведь рабочий ;)
|
|||
|
||||
kain76 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 3.7.2007 Репутация: нет Всего: нет |
Я искал на форуме и видел здесь эту фичу, но в этих темах конкретно не упоминали про то, как избавиться от лишних (не буквенных) данных в строке. Я так понимаю, что строка, которую я упомянул выводится именно из-за присутствия "описывающих" байтов, которые не декодируются.. Где-то в доках на CPAN я находил что-то об этом, но не могу найти снова. Вот и думал может кто подскажет как от них избавиться.. Encode в поиске ничего толкового не дал
Это сообщение отредактировал(а) kain76 - 4.7.2007, 04:52 |
|||
|
||||
nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 2 Всего: 84 |
неправильно понял, они все такие, а точнее вы неверно используете Encode, ещё более точно кодировку ![]() Ещё раз повторю: http://forum.vingrad.ru/index.php?showtopi...t&p=1183963 Сам вывел поиск, есть там... Вам уже подсказил - Encode::decode P.S.: Вы приведите пример текста!!! И будет вам счастье... Это сообщение отредактировал(а) nitr - 4.7.2007, 11:17 |
|||
|
||||
kain76 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 3.7.2007 Репутация: нет Всего: нет |
вот как я пытаюсь это вывести:
######################## use Device::Gsm; use Encode qw(encode decode); my $mystr; my $gsm = new Device::Gsm( port => 'COM3', pin => '' ); if( $gsm->connect() ) { print "connected!\n"; } else { print "sorry, no connection with gsm phone on serial port!\n"; } # Get list of Device::Gsm::Sms message objects # see `examples/read_messages.pl' for all the details my @messages = $gsm->messages(); # II. Recieving messages open(FILE, ">>SMS.txt"); for( $gsm->messages('SM') ) { print FILE $_->content(), " : ", $_->sender(), "\n"; $cont=$_->content(); $mystr = encode('cp1251', decode('UCS-2', $cont)); print FILE "$mystr"; } close (FILE); ############################### сам текст оттуда выколупывает Device::Gsm и мне он в первой строке возвращается в таком виде " Р_С_С%РёС' : +79098316102 " (кодировке винды), а вторая строка вообще отсутствует. Сам текст в SMS по идее - "Оущит" (был с похмелья:) так вот в итоге ругается так: Wide character in print at C:\Perl\scripts\1.pl line 38, <DATA> line 164. Wide character in subroutine entry at C:/Perl/lib/Encode.pm line 162, <DATA> line 164. Первая строка записывается в файл, а вторая - пустая. Такие дела. Как бороться? |
|||
|
||||
nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 2 Всего: 84 |
верно так, т.к. utf8
|
|||
|
||||
kain76 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 3.7.2007 Репутация: нет Всего: нет |
nitr, поменял на utf8.. теперь так говорит
Wide character in print at C:\Perl\scripts\1.pl line 38, <DATA> line 164. Cannot decode string with wide characters at C:/Perl/lib/Encode.pm line 162, <DATA> line 164. А вобще я читал, что SMS-сообщения передаются и хранятся в кодировке UCS-2.. тока там не уточняется LE или BE.. собственно я разницы не знаю, знаю только что их две. |
|||
|
||||
nitr |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 2 Всего: 84 |
kain76, тогда стоит вложить файл с текстом сообщения
![]() ![]() Даже если то что вы привели -
можно проверить тупо:
результат
А unicode выведет - угадайте?! Конечно в "китайской или иной" - короче иероглифы, самые настоящие... Добавлено через 12 минут и 40 секунд какая ОС? ![]() |
||||||
|
|||||||
kain76 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 3.7.2007 Репутация: нет Всего: нет |
Я писАл в первом сообщении: "Сразу говорю что это под WinXP (ActivePerl 5.8)"
Вложить какой файл? с каким сообщением? ![]() вот это вот сработало (действительно в utf8.. собсно чего я и хотел узнать ![]() for( $gsm->messages('SM') ) { $cont=$_->content(); $mystr = encode('cp1251', $cont); print FILE "$mystr\n"; } но блин всё равно ругается на "Wide characters" Вобщем, всем большое спасибо. Буду знать теперь куда обратиться. |
|||
|
||||
nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 2 Всего: 84 |
kain76, просто у вас странно приведён пример сообщения, вот и запутали с ОС.
А как можно, как пример ниже, (плюньте временно на "Wide... "), а прикрепите полученный файл content.txt к сообщению на форуме...
Будет сподручнее помогать ;) Тем более кроме меня тут много людей, кто сможет помочь... |
|||
|
||||
kain76 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 3.7.2007 Репутация: нет Всего: нет |
понятно, я просто не думал что кто-то будет ковырять контент, чтобы выяснить какая кодировка
![]() прикрепил файл с телом одного сообщения.. в оригинале текст - "Приз". может быть удастся выяснить что там за символы загадочные Только открывайте не в виндовых приложениях, потому что они автоматом перекодируют содержание Это сообщение отредактировал(а) kain76 - 9.7.2007, 01:13 Присоединённый файл ( Кол-во скачиваний: 20 ) ![]() |
|||
|
||||
nitr |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 2 Всего: 84 |
kain76, пока непонятно почему вы игнорируете ответы выше
![]() ![]()
Ваше сообщение в кодировке utf8, данный скрипт переводит в кодировку cp1251, так что не вижу чего-то уж неверного или нерабочего?! можно в Виндовой "консоле" ![]()
Это из-за того, что вы утверждаете, будто бы не работает ![]() Думаю ошибка уже кроется дальше... в выводе "ГОТОВОГО" сообщения... Куда вы его выводите, в какой вид или в какой кодировке? ;) Добавлено @ 01:18 Поэтому (код уж очень похож на прежние ответы из других похожих тем) я "советовал пользоваться поиском", т.к. такую проблему уже решали ни один раз... ;) Это сообщение отредактировал(а) nitr - 9.7.2007, 01:29 |
||||||||
|
|||||||||
kain76 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 3.7.2007 Репутация: нет Всего: нет |
nitr, да я ничего не игнорирую :) я уже ведь написАл, что всё заработало, только ругается на какие-то символы.
насчёт: видимо, я просто не пойму чего я не упомянул в ситуации :-)) я ведь и кусок кода привёл, где видно, что я записываю это в файл "SMS.txt".. так вот всё туда уже записывается в нужном виде (при просмотре файла в кодировке cp1251 я вижу слово "Приз"), но при этом не забыват поругаться на "Wide characters...". Теперь другой случай. Тупо не могу перекодировать строку "Здравствуй ворлд!" (редактирую в Far'е в кодировке Win) обратно в utf8, чтобы отослать сообщение.. Приходит в SMS какая-то абракадабра, хотя количество символов соответствует исходящему.. уже как только ни пробовал.. подскажите как правильно написАть, пожалуйста. |
|||
|
||||
nitr |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 2 Всего: 84 |
для этого я и просил показать само сообщение в её исходной кодировке... Добавлено через 46 секунд
проверяйте кодировку... Добавлено через 1 минуту и 26 секунд похоже вы В ЦЕЛОМ не разобрались с кодировками и модулем Encode (decode encode) |
||||
|
|||||
kain76 |
|
||||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 3.7.2007 Репутация: нет Всего: нет |
Я не могу этого сделать.. Просто не знаю как. Это делает Device::Gsm методом content() при передаче ему ссылки на массив сообщения. Как это происходит я не разбирался. Как это выглядит в файле при выводе выводе обработанной ссылки в переменную, а переменной в файл я показывал.
Ну, наконец-то, Вы поняли в чём проблема :) Так и есть. Стал бы я обращаться сюда, если бы смог разобраться сам? :) |
||||
|
|||||
nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 2 Всего: 84 |
Чтобы разобраться в модуле Encode, почитайте документацию, потестируйте. Вам, думаю, поможет "метод тыка"/"метод проб и ошибок"/"метод подбора", т.к. основные кодировки на глаз не определяете, и простые "ошибки" - тоже. Вам не поможет в этом форум, только вы сами...
Так что, Perl "в руки", и пробуйте, пробуйте, пробуйте... ![]()
|
|||
|
||||
Anarki |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 326 Регистрация: 14.3.2005 Репутация: нет Всего: 11 |
Просто надо использовать encode_utf8 вначале
$stroka в utf8 и содержит всякие wide characters
Это сообщение отредактировал(а) Anarki - 10.7.2007, 10:15 |
|||
|
||||
nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 2 Всего: 84 |
Anarki, я ему об этом уже много раз писал... А если гляните в модуль Encode.pm (не знаю удивитесь или нет) ваша функция аналогична тем, что уже обсуждались...
Anarki, плохие методы вы ему советуете, поиском на форуме можно найти тему, в которой как раз и обсуждали оное - вывод: использовать encode, decode. |
|||
|
||||
Anarki |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 326 Регистрация: 14.3.2005 Репутация: нет Всего: 11 |
Чем плоха? ВЫ указывали ему искать методом тыка, т.к наверное и не решали подобную проблему!
|
||||
|
|||||
nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 2 Всего: 84 |
![]()
всю тему перечитайте... Ничем неплоха, просто другой способ всех "здешних" ответов... А ему поможет, только "самообучение"/"тестирование", т.е. ему надо разобраться с этим + его смс "в абракадабре" (результат неверно выбранной кодировки). Это сообщение отредактировал(а) nitr - 10.7.2007, 13:11 |
|||
|
||||
nitr |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 2 Всего: 84 |
kain76, только что протестил:
не ругается... а обратно -
и "читабельно"... |
||||
|
|||||
kain76 |
|
||||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 3.7.2007 Репутация: нет Всего: нет |
да, всё работает сейчас нормально (в сторону cp1251)
пробовал.. в смс всё равно приходит ерунда :( просто я сильно ограничен во времени с этой задачей.. поэтому и обратился. сделал пока транслитом.. буду ковырять Это сообщение отредактировал(а) kain76 - 11.7.2007, 04:48 |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "Perl: Системное программирование" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Системное программирование | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |