У меня есть веб-сайт, который позволит людям публиковать на нем что-либо, используя тему письма в Outlook. Используя PHP и imap, я получаю строку темы текста и сохраняю ее в базе данных mysql. Но время от времени кто-то копирует текст с веб-сайта в строку темы этого письма, и я получаю искаженный текст. Похоже на это:
=? Windows-1252? Q? _Every_day_in_our_offices_we_recycle_cardboard,алюминий? =
=? Windows-1252? Q?= 96_won = 92t_you_join_us = 3F? =
Я попытался декодировать этот текст, чтобы он выглядел нормально на странице, используя следующий код:
$subject = strip_tags($mailHeader->subject);
$header = imap_mime_header_decode($subject);
$subject = "";
for($i=0;$i<count($header);$i++)
{
$subject .= $header[$i]->text;
}
Когда я закончу, я избавлюсь от большей части искаженного текста, но у меня останутся замещающие символы для тире и фигурные кавычки, которые были в исходном тексте строки темы. Смотрите результат ниже:
Каждый день в наших офисах мы перерабатываем картон, алюминий, не присоединитесь ли вы к нам?
Кодировка сайта настроена на UTF-8. Когда я устанавливаю кодировку веб-сайта на ISO-8859-1, заменяющие символы заменяются фигурной кавычкой и тире, что здорово, но я хочу оставить кодировку веб-сайта на UTF-8.
Любая помощь в том, как избавиться от заменяющих символов, не меняя кодировку на ISO-8859-1, была бы полезна. Благодарю.
Каждый из объектов, возвращаемых imap_mime_header_decode
включает в себя charset
свойство, которое вы игнорируете. Вам нужно будет преобразовать каждый из них в UTF-8 в вашем цикле, используя что-то вроде:
$subject .= mb_convert_encoding($header[$i]->text, "UTF-8", $header[$i]->charset);
В качестве альтернативы рассмотрите возможность использования mb_decode_mimeheader
или же iconv_mime_decode_headers
функции. Обе эти функции выполняют всю работу по декодированию MIME-заголовка для вас, возвращая строку во внутренней кодировке PHP (обычно это UTF-8).
Код выше работает за исключением одного небольшого изменения до самого конца:
$subject .= mb_convert_encoding($header[$i]->text, "UTF-8", $header[$i]->charset);