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?=
> > <[EMAIL PROTECTED]>".
> >
> > Раскодировать их умеет модуль 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
pgpx9ifLOnwMT.pgp
Description: PGP signature

