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

Кодирование Quoted-Printable в PHP: от основ к сложным случаям
Раздел: Преобразование типов/форматов
quoted_printable_encode(string $string): string

Функция quoted_printable_encode

Общее описание

Функция quoted_printable_encode() конвертирует строку в формат Quoted-Printable, как определено в RFC 2045. Этот стандарт кодирования данных используется, в первую очередь, для передачи текста по электронной почте (в MIME-сообщениях), где необходимо сохранить читаемость текста для ASCII-символов и безопасно закодировать не-ASCII символы (например, кириллицу или спецсимволы).

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

Функция принимает всего один обязательный параметр:

  • string – исходная строка, которую необходимо закодировать.

Она возвращает закодированную строку или false в случае ошибки.

Примеры использования

Базовое кодирование

Кодирование строки с русскими символами:

$text = "Привет, мир!";
echo quoted_printable_encode($text);
=D0=9F=D1=80=D0=B8=D0=B2=D0=B5=D1=82, =D0=BC=D0=B8=D1=80!
Кодирование с переносами строк

Функция автоматически добавляет мягкие переносы строк (символ = в конце строки), если строка превышает длину 75 символов, как того требует стандарт.

$longText = str_repeat('a', 80) . 'б';
echo quoted_printable_encode($longText);
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa=
=D0=B1

Альтернативные функции в PHP

imap_8bit()

Выполняет аналогичное кодирование Quoted-Printable. Может быть более предпочтительна при работе с модулем IMAP, но требует его наличия.

mb_convert_encoding()

Может выполнять конвертацию в Quoted-Printable с указанием кодировки, но для этого строку нужно предварительно подготовить. Является частью модуля mbstring.

iconv_mime_encode()

Используется для кодирования MIME-заголовков и может применять схему Quoted-Printable. Более сложная в использовании для кодирования тела сообщения.

Для простого кодирования тела письма или текстовых данных quoted_printable_encode() является наиболее прямой и удобной функцией, так как не требует дополнительных модулей.

Альтернативы в других языках

Python: quopri.encode()
import quopri
text = "Привет".encode('utf-8')
encoded = quopri.encodestring(text)
print(encoded.decode('ascii'))
=D0=9F=D1=80=D0=B8=D0=B2=D0=B5=D1=82

Отличие: В Python модуль quopri работает с байтами, а не со строками.

JavaScript (Node.js): библиотека 'qp-encoder'
const qp = require('qp-encoder');
const encoded = qp.encode('Привет');
console.log(encoded);
=D0=9F=D1=80=D0=B8=D0=B2=D0=B5=D1=82

В чистом JS нет встроенной функции, требуется сторонняя библиотека или реализация.

MySQL: QUOTE()

Функция QUOTE() в MySQL экранирует строку для SQL-запросов и не является аналогом Quoted-Printable кодирования. Прямого аналога в SQL нет.

Типичные ошибки

Ожидание декодирования

Некоторые разработчики ошибочно полагают, что функция может декодировать строку. Для декодирования предназначена quoted_printable_decode().

$encoded = "=D0=9F=D1=80=D0=B8=D0=B2=D0=B5=D1=82";
$decoded = quoted_printable_encode($encoded); // Ошибка! Это не декодирует строку.
echo $decoded;
=3DD0=3D9F=3DD1=3D80=3DD0=3DB8=3DD0=3DB2=3DD0=3DB5=3DD1=3D82
Кодирование уже закодированной строки

Повторное кодирование приводит к некорректным данным, так как символ = также будет закодирован.

Неявная зависимость от кодировки строки

Функция не принимает параметр кодировки. Она работает с байтовым представлением строки. Если строка сохранена в неправильной кодировке (не UTF-8), результат будет неверным.

Изменения в PHP 8

Начиная с PHP 8.2.0, функция quoted_printable_encode() больше не возвращает false в случае ошибки. Вместо этого она выбрасывает исключение типа ValueError, если переданный аргумент не является строкой. Это соответствует общей тенденции PHP к более строгой типизации.

// PHP < 8.2
$result = @quoted_printable_encode(null); // возвращает false
// PHP >= 8.2
$result = quoted_printable_encode(null); // Выбрасывает ValueError

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

Формирование части MIME-сообщения
Пример php
$subject = "Тема письма с символами: & < >";
$body = "Это тело письма\nс переносами строк и кириллицей.";

$headers = "Content-Type: text/plain; charset=utf-8\r\n";
$headers .= "Content-Transfer-Encoding: quoted-printable\r\n";

$encodedBody = quoted_printable_encode($body);
// В реальности $encodedBody будет подставлен в тело письма
echo $headers . "\n\n" . $encodedBody;
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

=D0=AD=D1=82=D0=BE =D1=82=D0=B5=D0=BB=D0=BE =D0=BF=D0=B8=D1=81=D1=8C=D0=BC=D0=B0
=D1=81 =D0=BF=D0=B5=D1=80=D0=B5=D0=BD=D0=BE=D1=81=D0=B0=D0=BC=D0=B8 =D1=81=D1=82=D1=80=D0=BE=D0=BA =
=D0=B8 =D0=BA=D0=B8=D1=80=D0=B8=D0=BB=D0=BB=D0=B8=D1=86=D0=B5=D0=B9.
Сравнение с base64_encode

Quoted-Printable сохраняет читаемость для ASCII-текста, в отличие от Base64.

Пример php
$englishText = "Hello, this is a simple ASCII text.";
echo 'QP: ' . quoted_printable_encode($englishText) . "\n\n";
echo 'B64: ' . base64_encode($englishText);
QP: Hello, this is a simple ASCII text.

B64: SGVsbG8sIHRoaXMgaXMgYSBzaW1wbGUgQVNDSUkgdGV4dC4=
Обработка бинарных данных

Функция может работать с бинарными данными, но для них чаще используют base64_encode(), так как он эффективнее.

Пример php
$binaryData = file_get_contents('small_image.png');
$encoded = quoted_printable_encode($binaryData);
echo 'Длина QP: ' . strlen($encoded) . "\n";
$encodedB64 = base64_encode($binaryData);
echo 'Длина B64: ' . strlen($encodedB64);
Длина QP: 18348
Длина B64: 12232

PHP quoted_printable_encode function comments

En
Quoted printable encode Convert a 8 bit string to a quoted-printable string