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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перекодировка разных форматов, Помогите со скриптом PERL 
V
    Опции темы
Pheanix
Дата 19.6.2008, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Добрый день!
Подскажите пожалуйста.
 Есть задача:
Одна система (неважно какая) принимает почту и кладет текст сообщения в БД MS SQL
Но только система не понимает koi8-r , а только win 1251. Причем юзеры посылают письма в разных форматах, кто в plain text, кто в HTML, кто в RTF. 
Я написал скрипт,который забирает текст из БД перекодирует его и кладет обратно, но только с форматом plain text, а как сделать с другими форматами? smile 
Кто может подсказать как написать скрипт на Perl который автоматически перекодировал текст из koi8-r в win1251 при чем независимо от формата.
ПОМОГИТЕЕЕЕЕЕЕЕ. Заранее спасибо!!!!!!!!!!!!!!!!!!!!!!

PM MAIL ICQ   Вверх
ginnie
Дата 19.6.2008, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



Уважаемый Pheanix, независимо от формата перекодировать не получится. Можно сделать перекодировщики для каждого формата.
Кстати RTF с KOI8 я еще не видел  smile (это не означает, что такого не может быть).


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Pheanix
Дата 19.6.2008, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



К сожалению, есть и в RTF.
А если написать для  каждого формата перекодировщик и с помощью поиска по шаблону, определять какая кодировка по тегам( к примеру если текст содержит теги "....<html xmlns:....." то это формат html, и.т.д.)
А как сделать перекодировщик к html формату? Я что-то такого модуля не нашел.
Единственное, чем пользовался - это "use Encode". Но он работает только с plain text!
PM MAIL ICQ   Вверх
dmitryk1
Дата 20.6.2008, 06:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Pheanix @  19.6.2008,  17:00 Найти цитируемый пост)
А как сделать перекодировщик к html формату?


интересно, а как бы ты в ручную переделал текст в хтмль? 
Я думаю такого кодировщика в принципе не может быть. 

Или по шаблонам, то есть обрамить весь текст тегами <body> и внутри заменить все переносы строки разрывами ну и ещё какие-либо правила использовать Цвета поменять, стили приделать, яваскрипт прикрутить... 

но это и без модуля очень просто делается, или делается специальным дизайнером(человеком).

Это сообщение отредактировал(а) dmitryk1 - 20.6.2008, 06:45
PM MAIL GTalk Jabber   Вверх
Pheanix
Дата 20.6.2008, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ок!
Я просто только начал изучать Perl.
Подскажите тогда, пожалуйста, как написать шаблон , что бы он заменял пробелами,а лучше вобще стирал, все , что находится к примеру между 2-мя скобками.

Что-то вроде такого, но не так:
 $text=~s/<>/./g;
Буду очень благодарен.
PM MAIL ICQ   Вверх
ginnie
Дата 20.6.2008, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



Код

s/<.+?>/<>/g


Это сообщение отредактировал(а) ginnie - 20.6.2008, 13:19


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Pheanix
Дата 20.6.2008, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо БОЛЬШОЕ.
Справился таким образом:
$text=~ s/<([^>]|\n)*>//g;

Добавлено через 14 минут и 45 секунд
Справится то справился, теги убирает. Вот только вместо тегов остаются пробелы. В итоге нужный текст где- то в середине болтается. Можете подсказать как и от пустого места избавиться?
PM MAIL ICQ   Вверх
ginnie
Дата 20.6.2008, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



Pheanix, если проблема с удалением многострочного тега, то можно

Код

s/<.+?>//gs



--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Pheanix
Дата 20.6.2008, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо большое. Но ваш вариант почему-то не сработал.
Нашел такой способ:

$text=~ s/^\s+//gm;

Теперь я смогу написать скрипт, который сможет перекодировать из любого формата кодировки( koi8-r в win1251).
Считаю топик закрытым!

ЕЩЕ РАЗ ВСЕМ СПАСИБО!!!!!!!!!!!
Жаль не могу никому добавить репутацию, топиков мало у меня.
PM MAIL ICQ   Вверх
ginnie
Дата 20.6.2008, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



Pheanix, можно попросить пример, где не срабатывает s/<.+?>//gs?


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Pheanix
Дата 20.6.2008, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот скрипт, на котором я тренеровался(в конце его мои комментарии):
#!/usr/bin/perl -w
use Encode;
$text ='<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:p="urn:schemas-microsoft-com:office:powerpoint" xmlns:a="urn:schemas-microsoft-com:office:access" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema" xmlns:b="urn:schemas-microsoft-com:office:publisher" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:c="urn:schemas-microsoft-com:office:component:spreadsheet" xmlns:oa="urn:schemas-microsoft-com:office:activation" xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:q="http://schemas.xmlsoap.org/soap/envelope/" xmlns:D="DAV:" xmlns:x2="http://schemas.microsoft.com/office/excel/2003/xml" xmlns:ois="http://schemas.microsoft.com/sharepoint/soap/ois/" xmlns:dir="http://schemas.microsoft.com/sharepoint/soap/directory/" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:dsp="http://schemas.microsoft.com/sharepoint/dsp" xmlns:udc="http://schemas.microsoft.com/data/udc" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sps="http://schemas.microsoft.com/sharepoint/soap/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:udcxf="http://schemas.microsoft.com/data/udc/xmlfile" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">

 

<head>

<meta http-equiv=Content-Type content="text/html; charset=koi8-r">

<meta name=Generator content="Microsoft Word 12 (filtered medium)">

<style>

<!--

 /* Font Definitions */

 @font-face

                {font-family:"Cambria Math";

                panose-1:2 4 5 3 5 4 6 3 2 4;}

@font-face

                {font-family:Calibri;

                panose-1:2 15 5 2 2 2 4 3 2 4;}

 /* Style Definitions */

 p.MsoNormal, li.MsoNormal, div.MsoNormal

                {margin:0cm;

                margin-bottom:.0001pt;

                font-size:11.0pt;

                font-family:"Calibri","sans-serif";}

a:link, span.MsoHyperlink

                {mso-style-priority:99;

                color:blue;

                text-decoration:underline;}

a:visited, span.MsoHyperlinkFollowed

                {mso-style-priority:99;

                color:purple;

                text-decoration:underline;}

span.EmailStyle17

                {mso-style-type:personal-compose;

                font-family:"Calibri","sans-serif";

                color:windowtext;}

.MsoChpDefault

                {mso-style-type:export-only;}

@page Section1

                {size:612.0pt 792.0pt;

                margin:2.0cm 42.5pt 2.0cm 3.0cm;}

div.Section1

                {page:Section1;}

-->

</style>

<!--[if gte mso 9]><xml>

 <o:shapedefaults v:ext="edit" spidmax="1026" />

</xml><![endif]--><!--[if gte mso 9]><xml>

 <o:shapelayout v:ext="edit">

  <o:idmap v:ext="edit" data="1" />

 </o:shapelayout></xml><![endif]-->

</head>

 

<body lang=RU link=blue vlink=purple>

 

<div class=Section1>

 

<p class=MsoNormal>чУС УЙУФЕНБ ОЕ ТБВПФБЕФ !!!<o:p></o:p></p>

 

<p class=MsoNormal>рТЙНЙФЕ НЕТЩ!!!<o:p></o:p></p>

 

</div>

 

</body>

 

</html>
';
$text=~ s/<([^>]|\n)*>//g;
##$text=s/<.+?>//gs;  -  таким образом я пробовал ваш вариант!!!
##$text=~ s/^\s+//gm; - а этот у меня заработал!!!!
open (VYHOD,">путь к файлу")|| die "$!";
my $text1=encode('cp1251',decode('koi8-r',$text));
print VYHOD $text1;
PM MAIL ICQ   Вверх
ginnie
Дата 20.6.2008, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



Pheanix, $text =~ s/<.+?>//gs; (в строке пропущен символ ~) я предложил вместо $text=~ s/<([^>]|\n)*>//g;. 




--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
nitr
Дата 20.6.2008, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Pheanix, чтобы более верно начинать писать скрипты и выявлять больше ошибок добавьте в начало скрипта use strict;.

Примерно так:
Код

#!/usr/bin/perl
use strict;
use warnings;

use Encode;
...



--------------------
PM   Вверх
Pheanix
Дата 20.6.2008, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Благодарю за подсказки и сопутствие в этом нелегком пути изучения Perl! smile 
  smile 
 smile 

Еще....., совсем забыл, давно , когда регистрировался на форуме неверно забил свой ник.
Надо чтобы был "Phoenix", а вот в редактировании профиля где поменять имя не нашел :(

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


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

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


 




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


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

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