Вот заголовки email закодированные по алгоритму Content-Transfer-Encoding: 7bit: Это одна и та же строка только в разной кодировке. Подскажите плиз, как эти строки перекодировать в нормальные читаемые человеком? Спасибо.
То что между ?B? и ?= декодируешь с помощью base64_decode и получаешь соответственно текст в win-1251 и koi8
Вот такая вот прекрассная функция: PHP: // Функция декодирования заголовка // Возвращает декодированный заколовок в кодировке Windows-1251 function encSubj($s) { if (preg_match("/^=\?([^\?]+)\?(B|Q)\?(.+)\?=/", $s, $val)) { // Проверяем, отвечает ли строка формату кодированного заголовка? // Если да, то *разбираем* строку, заполняя массив $val: // $val[0] - исходная строка // $val[1] - кодировка // $val[2] - способ кодирования // $val[3] - кодированная строка // Если да, выясняем способ кодирования по значению $val[2] и *декодируем* if($val[2] == 'B') { // декодируем Base64 $val[3] = base64_decode($val[3]); } elseif ($val[2] == 'Q') { // декодируем QuotedPrint $i=0; $len = strlen($val[3]); $new=''; while ($i<$len) { if($val[3][$i] == '%') { $new.=chr(hexdec($val[3][$i+1].$val[3][$i+2])); $i+=3; } else { $new.=$val[3][$i++]; } } $val[3] = $new; } // Проверяем, кодировку, если KOI8-R, то *перекодируем* строку в Windows-1251. if (!strcasecmp($val[1], 'koi8-r')) { $val[3] = convert_cyr_string($val[3], "k", "w"); } return $val[3]; } else { // Заголовок не отвечает известному нам формату кодирования - возвращаем *без изменений* return $s; } }
Надо поменять % на = в цикле PHP: <? while ($i<$len) { if($val[3][$i] == '[b]=[/b]') { $new.=chr(hexdec($val[3][$i+1].$val[3][$i+2])); $i+=3; } else { $new.=$val[3][$i++]; } } ?>