Quoted printable decode: примеры (PHP)

Использование функции quoted_printable_decode в PHP: практические примеры
Раздел: Преобразование типов/форматов
quoted_printable_decode(string $string): string

Описание функции quoted_printable_decode

Назначение функции

Функция quoted_printable_decode() в PHP преобразует строку из формата Quoted-Printable (QP) обратно в 8-битную строку. Этот формат кодирования часто применяется в электронной почте (MIME) для передачи двоичных данных через 7-битные каналы, сохраняя читаемость текста для систем, поддерживающих только ASCII.

Аргументы функции

Функция принимает единственный параметр:

  • $string (string) – строка, закодированная по стандарту Quoted-Printable, которую необходимо декодировать.

Возвращает декодированную строку или false в случае ошибки (например, если передан некорректный QP-текст).

Краткие примеры использования

Декодирование простой строки

Строка, где символ равенства с последующими шестнадцатеричными цифрами представляет закодированный байт.

<?php
$encoded = "=D0=9F=D1=80=D0=B8=D0=B2=D0=B5=D1=82";
echo quoted_printable_decode($encoded);
?>
Привет
Декодирование строки с мягкими переносами

Символ равенства в конце строки (=) указывает на мягкий перенос, который удаляется при декодировании.

<?php
$encoded = "Это длинная строка, которая была разбита на несколько строк=\nв формате Quoted-Printable.";
echo quoted_printable_decode($encoded);
?>
Это длинная строка, которая была разбита на несколько строк в формате Quoted-Printable.

Похожие функции в PHP

Выполняет обратное преобразование — кодирует строку в формат Quoted-Printable. Используется для подготовки данных к передаче, например, в теле email-сообщения.

iconv_mime_decode

Декодирует поле MIME-заголовка. Может работать с различными кодировками, включая Quoted-Printable и Base64. Более специализирована для разбора заголовков электронной почты.

imap_qprint

Функция из модуля IMAP, также декодирующая строку из Quoted-Printable представления. Требует установленного модуля imap и часто используется при работе с почтовыми ящиками.

quoted_printable_decode является базовой функцией для общего случая декодирования QP-данных, в то время как iconv_mime_decode больше подходит для заголовков, а imap_qprint — в контексте обработки почты через IMAP.

Аналоги в других языках

Quoted printable decode в Python

Модуль quopri содержит функции decodestring() и decode(). В отличие от PHP, работа ведется с байтовыми строками.

import quopri
encoded = b"=D0=9F=D1=80=D0=B8=D0=B2=D0=B5=D1=82"
decoded = quopri.decodestring(encoded)
print(decoded.decode('utf-8'))
Привет
JavaScript (Node.js)

Можно использовать сторонние пакеты (например, quoted-printable). Нативная поддержка отсутствует.

const qp = require('quoted-printable');
const encoded = "=D0=9F=D1=80=D0=B8=D0=B2=D0=B5=D1=82";
const decoded = qp.decode(encoded);
console.log(decoded); // Привет

Quoted printable decode в MySQL

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

Возможные ошибки

Некорректный формат Quoted-Printable

Если строка содержит неполные последовательности (например, один символ '=' в конце), они будут проигнорированы или обработаны некорректно.

<?php
$encoded = "Тест= "; // Пробел после '=' нарушает формат
echo quoted_printable_decode($encoded);
?>
Тест=
Неправильная кодировка результата

Функция возвращает двоичные данные. Если исходная строка была в UTF-8, но результат интерпретируется как другая кодировка (например, Windows-1251), возникнут искажения.

<?php
$encoded = "=CF=F0=E8=E2=E5=F2"; // Кодировка Windows-1251
$decoded = quoted_printable_decode($encoded);
echo mb_detect_encoding($decoded) . "\n"; // Может быть определено неверно
?>

Изменения в версиях PHP

В PHP 8.0 поведение функции было уточнено. Передача значения типа, отличного от строки, теперь вызывает ошибку TypeError. В предыдущих версиях такие аргументы преобразовывались в строку.

<?php
// PHP 7: преобразование массива в строку 'Array' и попытка декодирования.
// PHP 8: фатальная ошибка.
quoted_printable_decode([]);
?>

Расширенные примеры

Обработка вложений электронной почты

Декодирование текстовой части письма, закодированной в Quoted-Printable.

Пример php
<?php
// Пример тела письма в QP
$emailBody = "Здравствуйте!=\nВот документ: =D0=94=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD=D1=82.=\n=\nС уважением.";
$decodedBody = quoted_printable_decode($emailBody);
echo $decodedBody;
?>
Здравствуйте!
Вот документ: Документ.

С уважением.
Работа с разными кодировками

Декодирование строки с последующим приведением к нужной кодировке.

Пример php
<?php
$encoded = "=CE=E4=E8=ED =E7=E0=EF=F0=EE=F1"; // Windows-1251: "Один запрос"
$decoded = quoted_printable_decode($encoded);
// Преобразуем в UTF-8, если известно, что исходная кодировка Windows-1251
$utf8 = mb_convert_encoding($decoded, 'UTF-8', 'Windows-1251');
echo $utf8; // Один запрос
?>
Декодирование заголовков писем

Совместное использование с другими функциями для разбора заголовков.

Пример php
<?php
$subject = "=?UTF-8?Q?=D0=A2=D0=B5=D0=BC=D0=B0_=D0=BF=D0=B8=D1=81=D1=8C=D0=BC=D0=B0?=";
// Сначала убираем префикс кодировки и декодируем
if (preg_match('/^=\?([^?]+)\?Q\?(.*)\?=$/i', $subject, $matches)) {
    $decoded = quoted_printable_decode(str_replace('_', ' ', $matches[2]));
    echo $decoded; // Тема письма
}
?>

PHP quoted_printable_decode function comments

En
Quoted printable decode Convert a quoted-printable string to an 8 bit string