On Tuesday 18 July 2006 15:00, Dmitry E. Oboukhov wrote: > > > есть письмо в stdin > > > кормлю его MIME::Parser'у > > > далее хочу получить раскодированные заголовки (например From и To) > > > как просто получить заголовок закодированный в utf-8 или в кодировке > > > текущей локали (а не отправителя)? > > > > Значения полей с не ASCII-символами в заголовке должны кодироваться > > строчками вида "=?KOI8-R?Q?=EF=CC=C5=C7_=E1=CE=C9=D3=C9=CD=CF=D7?= > > <o_anisimov@dobroe.ru>". > > > > Раскодировать их умеет модуль MIME::WordDecoder. Я писал что-то типа > > такого: > > > > my $wd = MIME::WordDecoder->new([ > > 'US-ASCII' => sub { $_[0] }, > > 'KOI8-R' => sub { $_[0] }, > > 'WINDOWS-1251' => \&fromwin, > > 'CP1251' => \&fromwin, > > 'UTF8' => \&fromutf8, > > 'UTF-8' => \&fromutf8, > > '*' => sub { $_[0] }, > > ]); > > ... > > $from = $wd->decode($from); > > то есть фактически вручную раскодируем, что не очень изящно > разные части одного хидера могут быть закодированы в разные кодировки, > что совсем неудобно :-\ Это факт. И таких писем - море. Письмо в одной кодировке, заголовки в другой. Бывает, что даже в одном письме From кодируется в одной кодировке, а Subject в другой. Се ля ви. Поэтому и приходится вручную раскодировать. > софтина работающая с произвольными кодировками получается не очень > красивой. то есть надо брать нераскодированный заголовок и рекурсивно из > него вытаскивать регвыражение вида: > /\?(.+)\?[BQ]\?.*?\?=/ > раскодировать его, переводить из кодировки $1 в utf (или текующую > кодировку) Не надо. Это регулярное выражение есть внутри самого WordDecoder. Вы ему просто спихиваете все заголовки, которые есть в письме, не разбираясь, что там в них, а WordDecoder вернет уже плейнтекст в нужной вам кодировке. > идеально бы было конечно чтобы в случае с $parser->decode_headers(1); > хидеры возвращались бы приведенные к utf-8 (или к локали) > но это патчить надо MIME-tools С WordDecoder'ом - это один цикл. > а костыль расчитанный только на пару русских кодировок получается > хреновым, ибо как только появится третья русская кодировка в хидере или > четвертая нерусская и кранты :( > все таблицы не напишешь в виде функций Покопайтесь в кишках WordDecoder. Может там есть возможность обрабатывать кодировки не по табличке, а прямо передавать в Text::Iconv, чтобы он на выходе уже UTF-8 делал. PS. Теперь у меня еще вопрос. Про Text::Iconv. Есть ли в нем возможность, чтобы при обнаружении символов, отсутствующих в целевой кодировке, он пропускал эти символы (или заменял их на вопросик какой-нибудь)? У iconv(1) такая опция есть (omit invalid characters), а вот Text::Iconv сразу при этом спотыкается и возвращает undef. -- Best regards. Alexander Lourier. http://aml.rulezz.ru
Attachment:
pgptlVVp1kdIy.pgp
Description: PGP signature