|
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)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.cgi.perl/72186bfa5226e.html, оценка из 5, голосов 10
|