Mb decode mimeheader: примеры (PHP)
mb_decode_mimeheader(string $string, ?string $encoding = null): stringОписание функции mb_decode_mimeheader
Функция mb_decode_mimeheader в PHP предназначена для декодирования строк, которые были закодированы в соответствии со стандартом MIME (Multipurpose Internet Mail Extensions). Эта функция особенно полезна при обработке электронных писем, заголовков HTTP или любых других данных, где символы из наборов, отличных от ASCII, могут быть представлены в виде последовательностей, начинающихся со знака равенства и шестнадцатеричного кода (например, =?UTF-8?B?...?= или =?UTF-8?Q?...?=).
Функция принимает один обязательный аргумент и возвращает декодированную строку:
string mb_decode_mimeheader(string $string)
Аргумент $string представляет собой строку, закодированную по стандарту MIME header encoding, которую необходимо декодировать.
Примеры использования mb_decode_mimeheader
$encoded = "=?UTF-8?B?0J/RgNC40LLQtdGCLCDQv9GA0L7RgdC80L7RgtGA0LXQvQ==?=";
echo mb_decode_mimeheader($encoded);Привет, мир!
$encoded = "=?UTF-8?Q?=D0=9F=D1=80=D0=B8=D0=B2=D0=B5=D1=82=2C_=D0=BC=D0=B8=D1=80!?=";
echo mb_decode_mimeheader($encoded);Привет, мир!
$encoded = "=?UTF-8?B?0J/RgNC40LLQtdGC?=, =?UTF-8?Q?=2C_=D0=BC=D0=B8=D1=80?=";
echo mb_decode_mimeheader($encoded);Привет, мир
Похожие функции в PHP
Функция mb_encode_mimeheader выполняет обратную операцию - кодирует строку для использования в заголовках MIME. Ее применяют, когда требуется безопасно передать символы, отличные от ASCII, по протоколам, которые поддерживают только ASCII.
Функция iconv_mime_decode также декодирует MIME-заголовки. Основное отличие состоит в том, что она является частью модуля iconv, а не mbstring. В некоторых случаях iconv может поддерживать больше кодировок или иметь особенности в обработке. Для работы с многобайтовыми кодировками обычно рекомендуют функции mbstring, так как они специально разработаны для этой цели.
Функция imap_utf8 декодирует строку, закодированную в UTF-8 в соответствии с RFC2047. Она доступна, если установлен модуль IMAP. Эта функция может быть альтернативой для декодирования email-заголовков.
Типичные ошибки при использовании
Если передать строку, которая не содержит MIME-кодирования, функция вернет ее без изменений, что может быть неожиданным.
$str = "Простая строка";
echo mb_decode_mimeheader($str);Простая строка
Если указана неверная кодировка в самой закодированной строке, результат может быть некорректным или функция вернет искаженные данные.
$encoded = "=?ISO-8859-1?B?0J/RgNC40LLQtdGC?="; // Строка на самом деле в UTF-8
echo mb_decode_mimeheader($encoded);��� (или другие нечитаемые символы в зависимости от настроек)
Если закодированная строка повреждена (например, отсутствует закрывающая последовательность ?=), функция может вернуть часть строки или всю строку без декодирования.
$encoded = "=?UTF-8?B?0J/RgNC40LLQtdGCLCDQv9GA0L7RgdC80L7RgtGA0LXQvQ=="; // Нет закрывающего ?=
echo mb_decode_mimeheader($encoded);=?UTF-8?B?0J/RgNC40LLQtdGCLCDQv9GA0L7RgdC80L7RgtGA0LXQvQ==
Изменения в функции в последних версиях PHP
В PHP 8 существенных изменений в работе функции mb_decode_mimeheader не было. Однако, начиная с PHP 7.3, улучшена обработка многобайтовых кодировок и исправлены некоторые ошибки, связанные с некорректным декодированием определенных последовательностей. Рекомендуется использовать последнюю стабильную версию PHP для обеспечения лучшей совместимости и безопасности.
Расширенные примеры использования
$subject = "=?UTF-8?B?0KDQtdC60LvQsNC80Lgg0L/RgNC40LLQtdGC?=";
$decoded_subject = mb_decode_mimeheader($subject);
echo "Заголовок письма: " . $decoded_subject;Заголовок письма: Новое приветствие
Иногда в одной строке могут встречаться как закодированные, так и обычные части. Функция корректно их обрабатывает.
$mixed = "Слово: =?UTF-8?Q?=D0=9F=D1=80=D0=B8=D0=B2=D0=B5=D1=82?= и еще текст";
echo mb_decode_mimeheader($mixed);Слово: Привет и еще текст
MIME-заголовки могут быть разбиты на несколько строк с помощью переносов. Функция mb_decode_mimeheader автоматически их обрабатывает.
$multiLine = "=?UTF-8?B?0J/RgNC40LLQtdGCLCDQv9GA0L7RgdC80L7RgtGA0LXQ\n\tvQ==?=";
echo mb_decode_mimeheader($multiLine);Привет, мир!
// Предположим, у нас есть сырой заголовок письма
$raw_header = "Subject: =?UTF-8?B?0KDQtdC60LvQsNC80Lgg0L/RgNC40LLQtdGC?=\n";
// Извлекаем и декодируем значение заголовка
if (preg_match('/^Subject:\s*(.+)/mi', $raw_header, $matches)) {
$decoded = mb_decode_mimeheader(trim($matches[1]));
echo $decoded;
}Новое приветствие
Альтернативы в других языках программирования
Mb decode mimeheader в Python
В Python для декодирования MIME-заголовков используют модуль email.header и функцию decode_header.
from email.header import decode_header
encoded = "=?utf-8?b?0J/RgNC40LLQtdGCLCDQv9GA0L7RgdC80L7RgtGA0LXQvQ==?="
decoded_parts = decode_header(encoded)
result = ''.join([str(part[0], part[1] or 'utf-8') if isinstance(part[0], bytes) else part[0] for part in decoded_parts])
print(result)Привет, мир!
В Node.js можно использовать модуль iconv-lite или встроенный Buffer для декодирования MIME-заголовков. Прямого аналога нет, но можно реализовать свою функцию.
const encoded = "=?UTF-8?B?0J/RgNC40LLQtdGCLCDQv9GA0L7RgdC80L7RgtGA0LXQvQ==?=";
const decoded = encoded.replace(/=\?([^?]+)\?([BQ])\?([^?]*)\?=/gi, (match, charset, encoding, text) => {
if (encoding === 'B') {
return Buffer.from(text, 'base64').toString(charset);
} else if (encoding === 'Q') {
return Buffer.from(text.replace(/=/g, '').replace(/_/g, ' '), 'hex').toString(charset);
}
return match;
});
console.log(decoded);Привет, мир!
Mb decode mimeheader в MySQL
В MySQL нет встроенной функции для декодирования MIME-заголовков. Обычно такую обработку выполняют на стороне приложения, используя языки программирования, такие как PHP или Python.