>Хм, обновил версию модуля MIME::Words, все равно поведение с пробелами не изменилось. Угу, у него и в документации написано, что не полностью соответствует.
>Почитал RFC, там действительно определено что пробелы между закодированными блоками не отображаются,
>а между закодированным и не закодированным - вставляются. Получается проблема в
>MIME::Words, попытаюсь найти альтернативный модуль соблюдающий стандарт.
>
>PS. Посмотрел пару webmail на перл, там таже проблема.
Накидал такую функцию, мои тесты она проходит. Лицензия - "все_пофиг" :)
#!/usr/local/bin/perl
use strict;
use vars;
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("some very very long test subject = длинный тестовый сабжект", 'KOI8-R', length('Subject: ')));