[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: добавим офтопега



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


Reply to: