Perl функция для quoted-printable кодирования в соответствии с RFC2047 |
[исправить] |
Популярный Perl модуль MIME::Words не обеспечивает quoted-printable кодирование
в полном соотвтетвии с RFC2047 (пробелы между двумя закодированными блоками недопустимы).
# rfc2047conv (строка, кодировка, размер префикса);
sub rfc2047conv{
my $str = shift; # чего кодировать
my $charset = uc(shift); # какую кодировку приписать
my $init_len = shift || 0; # длина того, что планируется добавить потом в начало строки
my $len = length($str);
return '' unless($len);
my $begin = "=?$charset?Q?";
my $res = $begin;
my $count = $init_len + length($begin);
foreach my $c (split(//, $str)) {
my ($repl, $repl_len);
if($c eq '?' || $c eq '_' || $c eq '=' || $c lt ' ' || $c gt '~') {
$repl = sprintf("=%X", ord($c));
$repl_len = 3;
} elsif($c eq ' ') {
$repl = '_';
$repl_len = 1;
} else {
$repl = $c;
$repl_len = 1;
}
if($count + $repl_len > 72) {
$res .= "?=\r\n " . $begin;
$count = 1 + length($begin);
}
$res .= $repl;
$count += $repl_len;
}
$res .= '?=';
return $res;
}
printf("[%s]\n", rfc2047conv("проверка ", 'KOI8-R', length('Subject: ')));
|
|
|
|
Раздел: Корень / Программисту и web-разработчику / Perl / Полезные подпрограммы на Perl / Работа с сетью и IP адресами на Perl |
1, Stanislaus (ok), 01:38, 11/02/2009 [ответить]
| +/– |
Еще стоит взглянуть на Encode::MIME::Header, который позволяет производить эти манипуляции так:
use Encode qw/encode decode/;
$utf8 = decode('MIME-Header', $header);
$header = encode('MIME-Header', $utf8);
правда только для UTF-8, но обычно больше ничего и не нужно. Главное, что бы хорошо работало. Использовать MIME::Words из MIME::Tools не советую.
| |
|
2, dimedrol (?), 10:08, 12/06/2009 [^] [^^] [^^^] [ответить]
| +/– |
Спасибо автору!
Полезная функция. Но
в процессе эксплуатации заметил, что при переносе длинных строк, символы на границе строк могут быть перенесены некорректно, иногда разбиваются по середине, т.е. половина символа остается на одной строке, а вторая половина переносится на следую строку. Например, у меня была строка, в которой было слово 'найдено', и вот, как оно разбилось на части.
Буква 'д' , после кодирования должна превращаться в '=D0=B4' . Так вот '=D0' осталось на одной строке, а '=B4' перенеслось на следующую, и как следствие, при чтении этого письма в почтовом клиенте, вместо буквы д были два знака вопроса.
.....=D0=BD=D0=B0=D0=B9=D0?=
=?UTF-8?Q?=B4=D0=B5=D0=BD=D0=BE=A?=
Stanislaus писал:
>Еще стоит взглянуть на Encode::MIME::Header,
...
Я пробовал Encode::MIME::Header. Он у меня вообще не заработал:
https://rt.cpan.org/Public/Bug/Display.html?id=46832
| |
|
3, nm11 (?), 22:42, 05/05/2010 [ответить]
| +/– |
спасибо пригодилось
для отправки смс через e-mail
| |
|