За последние 24 часа нас посетил 24061 программист и 1527 роботов. Сейчас ищут 1280 программистов ...

Content-Transfer-Encoding: 7bit

Тема в разделе "Работа с почтой", создана пользователем Danilevsky, 12 апр 2006.

  1. Danilevsky

    Danilevsky Активный пользователь

    С нами с:
    12 фев 2006
    Сообщения:
    286
    Симпатии:
    0
    Адрес:
    Киев
    Вот заголовки email закодированные по алгоритму Content-Transfer-Encoding: 7bit:
    Это одна и та же строка только в разной кодировке.
    Подскажите плиз, как эти строки перекодировать в нормальные читаемые человеком?
    Спасибо.
     
  2. Danilevsky

    Danilevsky Активный пользователь

    С нами с:
    12 фев 2006
    Сообщения:
    286
    Симпатии:
    0
    Адрес:
    Киев
    Ошибка, строки закодированы в "quoted-printable".
     
  3. Mavir

    Mavir Guest

    То что между ?B? и ?= декодируешь с помощью base64_decode и получаешь соответственно текст в win-1251 и koi8
     
  4. Danilevsky

    Danilevsky Активный пользователь

    С нами с:
    12 фев 2006
    Сообщения:
    286
    Симпатии:
    0
    Адрес:
    Киев
    Mavir, Огромное спасибо - работает!!
     
  5. Danilevsky

    Danilevsky Активный пользователь

    С нами с:
    12 фев 2006
    Сообщения:
    286
    Симпатии:
    0
    Адрес:
    Киев
    а как декодировать?
     
  6. Danilevsky

    Danilevsky Активный пользователь

    С нами с:
    12 фев 2006
    Сообщения:
    286
    Симпатии:
    0
    Адрес:
    Киев
    Вот такая вот прекрассная функция:
    PHP:
    1. // Функция декодирования заголовка
    2. // Возвращает декодированный заколовок в кодировке Windows-1251
    3. function encSubj($s) {
    4.   if (preg_match("/^=\?([^\?]+)\?(B|Q)\?(.+)\?=/", $s, $val)) {
    5.   // Проверяем, отвечает ли строка формату кодированного заголовка?
    6.   // Если да, то *разбираем* строку, заполняя массив $val:
    7.   //   $val[0] - исходная строка
    8.   //   $val[1] - кодировка
    9.   //   $val[2] - способ кодирования
    10.   //   $val[3] - кодированная строка
    11.  
    12.   // Если да, выясняем способ кодирования по значению $val[2] и *декодируем*
    13.     if($val[2] == 'B') {
    14.     // декодируем Base64
    15.       $val[3] = base64_decode($val[3]);
    16.     } elseif ($val[2] == 'Q') {
    17.     // декодируем QuotedPrint
    18.       $i=0;
    19.       $len = strlen($val[3]);
    20.       $new='';
    21.       while ($i<$len) {
    22.         if($val[3][$i] == '%') {
    23.           $new.=chr(hexdec($val[3][$i+1].$val[3][$i+2]));
    24.           $i+=3;
    25.         } else {
    26.           $new.=$val[3][$i++];
    27.         }
    28.  
    29.       }
    30.       $val[3] = $new;
    31.     }
    32.     // Проверяем, кодировку, если KOI8-R, то *перекодируем* строку в Windows-1251.
    33.     if (!strcasecmp($val[1], 'koi8-r')) {
    34.       $val[3] = convert_cyr_string($val[3], "k", "w");
    35.     }
    36.     return $val[3];
    37.   } else {
    38.   // Заголовок не отвечает известному нам формату кодирования - возвращаем *без изменений*
    39.     return $s;
    40.   }
    41. }
     
  7. Danilevsky

    Danilevsky Активный пользователь

    С нами с:
    12 фев 2006
    Сообщения:
    286
    Симпатии:
    0
    Адрес:
    Киев
    а как декодировать?
    Все равно не декодируется эта строка.
     
  8. Mavir

    Mavir Guest

    Надо поменять % на = в цикле
    PHP:
    1. <?
    2.       while ($i<$len) {
    3.         if($val[3][$i] == '[b]=[/b]') {
    4.           $new.=chr(hexdec($val[3][$i+1].$val[3][$i+2]));
    5.           $i+=3;
    6.         } else {
    7.           $new.=$val[3][$i++];
    8.         }
    9.  
    10.       }
    11. ?>