Получить тему письма из заголовков

partizan

Новичок
Получить тему письма из заголовков

Если в письме тема с русскими символами, то заголовок выглядит вроде такого:
Subject: =?KOI8-R?B?8M/T1MnOxyDEwdTUyc7HLtLV?=

Нет-ли универсальной ф-и, которая перекодирует такое дело в вин-1251?

Тоесть, ф-я, которая сама определит, в какой кодировке тема, и переведет в нужную
 

Garret

Кто здесь?
Ты думаешь приведенная тобой тема в неправильной кодировке?
 

partizan

Новичок
В правильной, но она может быть в любой кодировке, а мне нужно получить тему в вин-1251. или в утф, не важно, но в какой-то конкретной

-~{}~ 15.06.07 20:14:

Впринципе с такой темой справится можно так:

PHP:
function get_header($h)
 {
     $arr = explode('?', $h, 4);
     $in_charset = $arr[1];
     $text = $arr[3];
     $text = substr($text, 0, strlen($text)-2);
     $text = base64_decode($text);
     
     return iconv($in_charset, 'WINDOWS-1251', $text);
 }
Но не думаю, что это подойдет для любого письма
 

Trianon

Новичок
Автор оригинала: partizan
В правильной, но она может быть в любой кодировке, а мне нужно получить тему в вин-1251. или в утф, не важно, но в какой-то конкретной
Но не думаю, что это подойдет для любого письма
Лучше выбрать не Windows-1251, а utf-8

Если сводить к utf-8, куда меньше шансов потерять что-то существенное.
Крооме того, вероятно, стоит перед этим попытаться свести многообразие синонимов к именам, кторые iconv однозначно воспринимает. Я о cp1251, windows-1251 и т.п.
 

Фанат

oncle terrible
Команда форума
Trianon
Дурацкий совет.
если вся страница в 1251, то переводить в юникод бессмысленно.
А если уж переводить весь сайт в юникод, то уж всяко не по соображениям отображения заголовков писем
 

God

Новичок
Было такое, только не все кодировки подключены
PHP:
	function FieldValueCallBack($matches)
	{
		switch (strtoupper($matches[2]))
		{
		case 'B':
			$matches[3] = base64_decode($matches[3]);
			break;
		case 'Q':
			$matches[3] = quoted_printable_decode(str_replace('_', ' ', $matches[3]));
			break;
		}
		$matches[1] = strtolower($matches[1]);
		if (strcmp($matches[1], 'windows-1251'))
			switch ($matches[1])
			{
			case 'koi8-r':
			case 'iso8859-5':
				$matches[3] = convert_cyr_string($matches[3], $matches[1]{0}, 'w');
				break;
			}
		return $matches[3];
	}
	function PrepareFieldValue($val)
	{
		return preg_replace_callback('#=\?([^\?]+)\?(Q|B)\?(.+)\?=#iU', 'FieldValueCallBack', $val);
	}

	echo PrepareFieldValue('=?KOI8-R?B?8M/T1MnOxyDEwdTUyc7HLtLV?=');
Изменено после нижеследующего совета Фaната
 

God

Новичок
Фaнат Скока оказывается есть разных функций. Мда, на получается ещё полностью портировать сишный код. ((
 

God

Новичок
Согласен. Изменить нужно для универсальности
PHP:
...
		$matches[1] = strtolower($matches[1]);
		if (strcmp($matches[1], 'windows-1251'))
		{
			if (function_exists('iconv'))
				$matches[3] = iconv($matches[1], 'windows-1251', $matches[3]);
			else
			{
				switch ($matches[1])
				{
				case 'koi8-r':
				case 'iso8859-5':
					$matches[3] = convert_cyr_string($matches[3], $matches[1]{0}, 'w');
					break;
				}
			}
		}
...
 

God

Новичок
Для возможной обработки других кодировок. Легче будет просто добавлять нужные кейсы.
 

Фанат

oncle terrible
Команда форума
ох, до чего я люблю такую "предусмотрительность"...
 

Trianon

Новичок
>если вся страница в 1251, то переводить в юникод бессмысленно.
Я не предлагал формировать страницу в 1251. А ТС на этом не настаивал, иначе бы я просто не стал отвечать.

Но даже если страница в 1251 (или любой другой национальной кодировке) - это не так. Если трафик символов-исключений не превышает определенного уровня(допустим, меньше процента), вполне реально вывести их html-эквивалентами на фоне большей части текста.

>А если уж переводить весь сайт в юникод, то уж всяко не по соображениям отображения заголовков писем

Конечно, не из-за заголовков.
Из-за почты, которая может прийти какой угодно, и рамками сайта никак не связана.
 

partizan

Новичок
Автор оригинала: *****
а идея с iconv у partizanа-то поуниверсальнее будет.
Но не факт, что онда и та же кодировка в заголовках письма и в iconv одинаково называется (или все названия стандартны?)

А во втором параметре ($matches[2]) Кроме B и Q еще какие-нибудь варианты могут быть?
 

cDLEON

Онанист РНРСlub
Но не факт, что онда и та же кодировка в заголовках письма и в iconv одинаково называется (или все названия стандартны?)
Гм....На сколько я знаю, кодировка - это уже стандарт.

-~{}~ 18.06.07 05:30:

Или вы считаете, что формат задаёт не кодирова, а библиотека iconv ?!?!?
 

Фанат

oncle terrible
Команда форума
partizan
я тоже не знаю. но идея хорошая, и я бы стал её применять до тех пор, пока она не дала бы сбой.

Кроме B и Q других вариантов нет
вообще, составляя такие функции, RFC очень полезно читать ;-)
 

partizan

Новичок
Автор оригинала: cDLEON
Гм....На сколько я знаю, кодировка - это уже стандарт.

-~{}~ 18.06.07 05:30:

Или вы считаете, что формат задаёт не кодирова, а библиотека iconv ?!?!?
Я имею ввиду название кодировки может отличатся, напимер в теме письма может быть написано "UTF8", у iconv нужно передать "UTF-8" и т.д.
 
Сверху