Модераторы: ginnie, korob2001

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как раскодировать cp1251 из Unicode (SMS), декодирование контента SMS 
:(
    Опции темы
kain76
  Дата 3.7.2007, 01:37 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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. 
Буду благодарен за кусок кода  smile 
smile
PM MAIL   Вверх
nitr
Дата 3.7.2007, 08:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 2
Всего: 84



Цитата(kain76 @  3.7.2007,  01:37 Найти цитируемый пост)
Я установил все примочки для Encode

это какие? Он и в своём "изначальном" виде прекрасный инструмент...

Вы или процитируйте сообщение, или вложите файл, который надо "раскодировать" ;)

Добавлено через 2 минуты и 34 секунды
тут слишком много раз обсуждалось - так что можете воспользоваться "Поиском" на форуме, думаю достаточно ввести Encode

Ещё есть неплохая фича вот по этому адресу (она кстати, выводится уже при создании темы, чтобы могли сразу найти ответ, вдруг вопрос поднимался уже) смотреть тут - 
http://forum.vingrad.ru/forum/topic-161775...845/0.html#look


--------------------
PM   Вверх
sharq
Дата 3.7.2007, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

Репутация: 3
Всего: 28



kain76, функция decode тебе поможет smile


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
GoodBoy
Дата 3.7.2007, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Главный джедай
****


Профиль
Группа: Модератор
Сообщений: 3886
Регистрация: 8.1.2003
Где: КМВ

Репутация: нет
Всего: 83



Код
use Encode qw(encode decode);

my $str1251 = encode('cp1251', decode('UCS-2', $strUCS2));



--------------------
Чем дальше в лес, тем толще партизаны...

Цитата(igorold @  1.5.2016,  17:40 Найти цитируемый пост)
Индейцы не обратили внимания на поток беженцев из Европы… Теперь они живут в резервациях. 
PM MAIL   Вверх
nitr
Дата 3.7.2007, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 2
Всего: 84



GoodBoysharq, тут слишком много про это говорилось... я бы сказал больше, но сам уже "тыщу" раз отвечал... пусть научится пользоваться поиском, он ведь рабочий ;)


--------------------
PM   Вверх
kain76
Дата 4.7.2007, 04:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 3.7.2007

Репутация: нет
Всего: нет



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

Это сообщение отредактировал(а) kain76 - 4.7.2007, 04:52
PM MAIL   Вверх
nitr
Дата 4.7.2007, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 2
Всего: 84



Цитата(kain76 @  4.7.2007,  04:47 Найти цитируемый пост)
Я так понимаю, что строка, которую я упомянул выводится именно из-за присутствия "описывающих" байтов

неправильно понял, они все такие, а точнее вы неверно используете Encode, ещё более точно кодировку smile

Ещё раз повторю: http://forum.vingrad.ru/index.php?showtopi...t&p=1183963

Сам вывел поиск, есть там... Вам уже подсказил - Encode::decode

P.S.: Вы приведите пример текста!!! И будет вам счастье...

Это сообщение отредактировал(а) nitr - 4.7.2007, 11:17


--------------------
PM   Вверх
kain76
  Дата 5.7.2007, 00:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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.

Первая строка записывается в файл, а вторая - пустая.
Такие дела. Как бороться?
PM MAIL   Вверх
nitr
Дата 5.7.2007, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 2
Всего: 84



верно так, т.к. utf8
Код

encode('cp1251',decode('utf8', $cont));



--------------------
PM   Вверх
kain76
Дата 5.7.2007, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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.. собственно я разницы не знаю, знаю только что их две.
PM MAIL   Вверх
nitr
Дата 6.7.2007, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 2
Всего: 84



kain76, тогда стоит вложить файл с текстом сообщения smile - Не знаю где вы чего читали, но я работал с этим и знаю, что мои были utf8 и НИЧЕГО ДРУГОГО... smile

Даже если то что вы привели - 
Цитата
" Р_С_С%РёС' : +79098316102 " (кодировке винды),
 очень на то похоже!
 можно проверить тупо:
Код

#!perl
use strict;
use warnings;
use Encode 'decode', 'encode';

my $str = 'Оущит';
my $ostr = 'Оущит';
print $str."\n";
print "\n".decode('cp1251', $ostr);

результат
Цитата

Оущит
Оущит


А unicode выведет - угадайте?! Конечно в "китайской или иной" - короче иероглифы, самые настоящие...

Добавлено через 12 минут и 40 секунд
какая ОС? smile


--------------------
PM   Вверх
kain76
Дата 6.7.2007, 06:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 3.7.2007

Репутация: нет
Всего: нет



Я писАл в первом сообщении: "Сразу говорю что это под WinXP (ActivePerl 5.8)"

Вложить какой файл? с каким сообщением? smile я же говорю, что беру тело сообщения, которое хранится на сим-карте в модеме.

вот это вот сработало (действительно в utf8.. собсно чего я и хотел узнатьsmile):

for( $gsm->messages('SM') )
    {   
     $cont=$_->content();
     $mystr = encode('cp1251', $cont);
     print FILE "$mystr\n";
    } 

но блин всё равно ругается на "Wide characters"
Вобщем, всем большое спасибо. Буду знать теперь куда обратиться.
PM MAIL   Вверх
nitr
Дата 6.7.2007, 07:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 2
Всего: 84



kain76, просто у вас странно приведён пример сообщения, вот и запутали с ОС.

А как можно, как пример ниже, (плюньте временно на "Wide... "), а прикрепите полученный файл content.txt к сообщению на форуме...
Код

for( $gsm->messages('SM') ) {   
    $cont=$_->content();
    open my $flh, '>> content.txt';
    print $flh $cont."\n\n";
    close $flh;
    ...


Будет сподручнее помогать ;) Тем более кроме меня тут много людей, кто сможет помочь...


--------------------
PM   Вверх
kain76
Дата 9.7.2007, 00:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 3.7.2007

Репутация: нет
Всего: нет



понятно, я просто не думал что кто-то будет ковырять контент, чтобы выяснить какая кодировка smile
прикрепил файл с телом одного сообщения.. в оригинале текст - "Приз". может быть удастся выяснить что там за символы загадочные
Только открывайте не в виндовых приложениях, потому что они автоматом перекодируют содержание

Это сообщение отредактировал(а) kain76 - 9.7.2007, 01:13

Присоединённый файл ( Кол-во скачиваний: 20 )
Присоединённый файл  SMS.txt 0,01 Kb
PM MAIL   Вверх
nitr
Дата 9.7.2007, 01:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 2
Всего: 84



kain76, пока непонятно почему вы игнорируете ответы выше smile , т.к. снова привожу код, который выводит "Приз" smile
Код
#!/usr/bin/perl
use Encode 'decode', 'encode';

open my $flh, '<SMS.txt';
local $/;
my $content = <$flh>;
close $flh;
print "Content-type: text/html\n\n";
print encode('cp1251', decode('utf8', $content));


Ваше сообщение в кодировке utf8, данный скрипт переводит в кодировку cp1251, так что не вижу чего-то уж неверного или нерабочего?!

можно в Виндовой "консоле" smile
Код
#!/usr/bin/perl
use Encode 'decode', 'encode';

open my $flh, '<SMS.txt';
local $/;
my $content = <$flh>;
close $flh;
print encode('cp866', decode('utf8', $content));

Цитата
C:\Documents and Settings\nitr>sample.pl
Приз



Цитата(kain76 @  9.7.2007,  00:59 Найти цитируемый пост)
понятно, я просто не думал что кто-то будет ковырять контент, чтобы выяснить какая кодировка smile

Это из-за того, что вы утверждаете, будто бы не работает smile

Думаю ошибка уже кроется дальше... в выводе "ГОТОВОГО" сообщения... Куда вы его выводите, в какой вид или в какой кодировке? ;)

Добавлено @ 01:18
Поэтому (код уж очень похож на прежние ответы из других похожих тем) я "советовал пользоваться поиском", т.к. такую проблему уже решали ни один раз... ;)

Это сообщение отредактировал(а) nitr - 9.7.2007, 01:29


--------------------
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: Системное программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к системному программированию на Perl
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1167 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.