Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: разработка для Web > Перекодировка разных форматов


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

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

Автор: Pheanix 19.6.2008, 17:00
К сожалению, есть и в RTF.
А если написать для  каждого формата перекодировщик и с помощью поиска по шаблону, определять какая кодировка по тегам( к примеру если текст содержит теги "....<html xmlns:....." то это формат html, и.т.д.)
А как сделать перекодировщик к html формату? Я что-то такого модуля не нашел.
Единственное, чем пользовался - это "use Encode". Но он работает только с plain text!

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


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

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

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

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

Что-то вроде такого, но не так:
 $text=~s/<>/./g;
Буду очень благодарен.

Автор: ginnie 20.6.2008, 13:16
Код

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

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

Добавлено через 14 минут и 45 секунд
Справится то справился, теги убирает. Вот только вместо тегов остаются пробелы. В итоге нужный текст где- то в середине болтается. Можете подсказать как и от пустого места избавиться?

Автор: ginnie 20.6.2008, 14:09
Pheanix, если проблема с удалением многострочного тега, то можно

Код

s/<.+?>//gs

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

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

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

ЕЩЕ РАЗ ВСЕМ СПАСИБО!!!!!!!!!!!
Жаль не могу никому добавить репутацию, топиков мало у меня.

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

Автор: Pheanix 20.6.2008, 14:55
Вот скрипт, на котором я тренеровался(в конце его мои комментарии):
#!/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;

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


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

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

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

use Encode;
...

Автор: Pheanix 20.6.2008, 17:05
Благодарю за подсказки и сопутствие в этом нелегком пути изучения Perl! smile 
  smile 
 smile 

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)