| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Perl: разработка для Web > Перекодировка разных форматов |
| Автор: Pheanix 19.6.2008, 16:41 |
| Добрый день! Подскажите пожалуйста. Есть задача: Одна система (неважно какая) принимает почту и кладет текст сообщения в БД MS SQL Но только система не понимает koi8-r , а только win 1251. Причем юзеры посылают письма в разных форматах, кто в plain text, кто в HTML, кто в RTF. Я написал скрипт,который забирает текст из БД перекодирует его и кладет обратно, но только с форматом plain text, а как сделать с другими форматами? Кто может подсказать как написать скрипт на Perl который автоматически перекодировал текст из koi8-r в win1251 при чем независимо от формата. ПОМОГИТЕЕЕЕЕЕЕЕ. Заранее спасибо!!!!!!!!!!!!!!!!!!!!!! |
| Автор: ginnie 19.6.2008, 16:51 |
| Уважаемый Pheanix, независимо от формата перекодировать не получится. Можно сделать перекодировщики для каждого формата. Кстати RTF с KOI8 я еще не видел |
| Автор: Pheanix 19.6.2008, 17:00 |
| К сожалению, есть и в RTF. А если написать для каждого формата перекодировщик и с помощью поиска по шаблону, определять какая кодировка по тегам( к примеру если текст содержит теги "....<html xmlns:....." то это формат html, и.т.д.) А как сделать перекодировщик к html формату? Я что-то такого модуля не нашел. Единственное, чем пользовался - это "use Encode". Но он работает только с plain text! |
| Автор: dmitryk1 20.6.2008, 06:43 |
интересно, а как бы ты в ручную переделал текст в хтмль? Я думаю такого кодировщика в принципе не может быть. Или по шаблонам, то есть обрамить весь текст тегами <body> и внутри заменить все переносы строки разрывами ну и ещё какие-либо правила использовать Цвета поменять, стили приделать, яваскрипт прикрутить... но это и без модуля очень просто делается, или делается специальным дизайнером(человеком). |
| Автор: Pheanix 20.6.2008, 12:49 |
| Ок! Я просто только начал изучать Perl. Подскажите тогда, пожалуйста, как написать шаблон , что бы он заменял пробелами,а лучше вобще стирал, все , что находится к примеру между 2-мя скобками. Что-то вроде такого, но не так: $text=~s/<>/./g; Буду очень благодарен. |
| Автор: ginnie 20.6.2008, 13:16 | ||
|
| Автор: Pheanix 20.6.2008, 13:51 |
| Спасибо БОЛЬШОЕ. Справился таким образом: $text=~ s/<([^>]|\n)*>//g; Добавлено через 14 минут и 45 секунд Справится то справился, теги убирает. Вот только вместо тегов остаются пробелы. В итоге нужный текст где- то в середине болтается. Можете подсказать как и от пустого места избавиться? |
| Автор: ginnie 20.6.2008, 14:09 | ||
Pheanix, если проблема с удалением многострочного тега, то можно
|
| Автор: 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;. Примерно так:
|
| Автор: Pheanix 20.6.2008, 17:05 |
| Благодарю за подсказки и сопутствие в этом нелегком пути изучения Perl! Еще....., совсем забыл, давно , когда регистрировался на форуме неверно забил свой ник. Надо чтобы был "Phoenix", а вот в редактировании профиля где поменять имя не нашел :( |