Главная страница


ru.cgi.perl

 
 - RU.CGI.PERL ------------------------------------------------------------------
 From : Artem Chuprina                       2:5020/371.32  22 Jan 2001  13:15:16
 To : Vladimir Smoliy
 Subject : Re: Как перекодировать?
 -------------------------------------------------------------------------------- 
 
 В твоём письме от Fri, 19 Jan 2001 22:09:20 +0300 написано:
 
 rnr>>> Сегодня столкнулся с тем, что поле Subject некоторые почтовые клиенты
 rnr>>> (Bat, например) заполнют вот так: Subject:
 rnr>>> =?koi8-r?B?UmU6IFVGT1JVTXzpxMXO1MnGycPJ0s/Xwc7BIM3VzcnRIPLBzdrF08
 rnr>>> Eg0MXS Это при том, что на Hетскейпе все отлажено, и CGI читает данные
 rnr>>> из этого поля нормально и в тексте и в QP. Итак, вопрос - как это
 rnr>>> перекодировать в русские буквы? И как это идентифицировать, то есть по
 rnr>>> каким признакам включить перекодировку?
 AC>> Это кодирование в соответствии с RFC1522 с использованием Base64.
 AC>> MIME::Base64 в руки, и вперед, отгрызя предварительно от третьего ? до
 AC>> следующего ?, завершающего строку. При наличии MIME::Base64 и
 AC>> MIME::QuotedPrint можно пользоваться MIME::Words, он специально для
 AC>> работы с RFC1522 заголовками придуман. _Рас_кодирует он нормально
 AC>> (_за_кодирует глючно). Перекодировку между charset'ами делать
 AC>> самостоятельно, благо charset в заголовке указан.
 VS> К сожалению, убеждать того вебмастеpа поставить модуль нужно неделями. Hа
 VS> пеpвый десяток писем он отвечает, что нет такого модуля. И вообще даpеному
 VS> коню в зубы не смотpят, а два гига бесплатно не везде дают. Как pаз с
 VS> пеpекодиpовкой между чаpсетами нет никаких сложностей. А вот нет ли
 VS> комплекта pегуляpных выpажений, котоpые пеpевели бы base64 в удобочитаемый
 VS> вид?
 
 Регулярных выражений, подозреваю, нет - это кодирование "три байта в четыре
 символа". А вот функция есть, причем (surprise, surprise!) в самом
 MIME::Base64:
 
 # Historically this module has been implemented as pure perl code.
 # The XS implementation runs about 20 times faster, but the Perl
 # code might be more portable, so it is still here.
 
 use integer;
 
 sub old_encode_base64 ($;$)
 {
     my $res = "";
     my $eol = $_[1];
     $eol = "\n" unless defined $eol;
     pos($_[0]) = 0;                          # ensure start at the beginning
     while ($_[0] =~ /(.{1,45})/gs) {
     $res .= substr(pack('u', $1), 1);
     chop($res);
     }
     $res =~ tr|` -_|AA-Za-z0-9+/|;               # `# help emacs
     # fix padding at the end
     my $padding = (3 - length($_[0]) % 3) % 3;
     $res =~ s/.{$padding}$/'=' x $padding/e if $padding;
     # break encoded string into lines of no more than 76 characters each
     if (length $eol) {
     $res =~ s/(.{1,76})/$1$eol/g;
     }
     $res;
 }
 sub old_decode_base64 ($)
 {
     local($^W) = 0; # unpack("u",...) gives bogus warning in 5.00[123]
 
     my $str = shift;
     my $res = "";
 
     $str =~ tr|A-Za-z0-9+=/||cd;            # remove non-base64 chars
     if (length($str) % 4) {
     require Carp;
     Carp::carp("Length of base64 data not a multiple of 4")
     }
     $str =~ s/=+$//;                        # remove padding
     $str =~ tr|A-Za-z0-9+/| -_|;            # convert to uuencoded format
     while ($str =~ /(.{1,60})/gs) {
     my $len = chr(32 + length($1)*3/4); # compute length byte
     $res .= unpack("u", $len . $1 );    # uudecode
     }
     $res;
 }
 
 -- 
 Artem Chuprina                            E-mail: ran@ran.pp.ru
 Programmer                                  FIDO: 2:5020/371.32
 Memonet Ltd.                             Phone: +7-095-284-1356
 --- slrn/0.9.6.3-as (Linux)
  * Origin: AKA с подствольным плюсомётом (2:5020/371.32)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Как перекодировать?   Rigel   09 Jan 2001 09:53:08 
 Re: Как перекодировать?   Artem Chuprina   15 Jan 2001 12:20:02 
 Как перекодировать?   Vladimir Smoliy   19 Jan 2001 23:09:20 
 Re: Как перекодировать?   Artem Chuprina   22 Jan 2001 13:15:16 
Архивное /ru.cgi.perl/72186bfa5226e.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional