#! /usr/bin/perl
#

# 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: ')));
