W3docs

quoted_printable_decode()

Статья о функции PHP quoted_printable_decode(), которая декодирует строку в формате quoted-printable обратно в 8-битный вид.

Функция PHP quoted_printable_decode() преобразует строку в формате quoted-printable обратно в исходный 8-битный вид. Quoted-printable — это кодировка, определённая стандартом MIME (RFC 2045), которая позволяет тексту, содержащему байты не из ASCII, безопасно передаваться через системы — прежде всего электронную почту, — рассчитанные только на 7-битный ASCII. На этой странице объясняется, как выглядит кодировка, когда её нужно декодировать и на какие нюансы следует обратить внимание.

Что такое quoted-printable?

В кодировке quoted-printable любой байт, который не является «безопасным» печатаемым символом ASCII, записывается как знак равенства, за которым следует его двузначное шестнадцатеричное значение. Например, пробел может выглядеть как =20, а буква с акцентом è (последовательность байт UTF-8 C3 A8) становится =C3=A8. Одиночный = в конце строки — это мягкий перевод строки, используемый для сохранения длины закодированных строк не более 76 символов; при декодировании он удаляется.

Чаще всего с этой кодировкой можно встретиться в теле и заголовках сообщений электронной почты, где заголовок Content-Transfer-Encoding: quoted-printable сообщает клиенту, как хранится текст.

Синтаксис

quoted_printable_decode(string $string): string

Функция принимает один аргумент и возвращает декодированную строку.

ПараметрТипОписание
$stringstringСтрока в формате quoted-printable для декодирования.

Возвращаемое значение: декодированная 8-битная строка. Последовательности, не являющиеся допустимым quoted-printable, возвращаются без изменений, а не вызывают ошибку.

Базовый пример

php— editable, runs on the server

Здесь =20 — шестнадцатеричный код пробела (ASCII 32), поэтому вывод будет следующим:

Hello World!

Декодирование текста с акцентами и мягкими переносами строк

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

<?php
$encoded = "J=27interpr=C3=A8te=20du=20fran=C3=A7ais,=\n et c=27est tout.";
echo quoted_printable_decode($encoded);
?>

Вывод:

J'interprète du français, et c'est tout.

Обратите внимание на два момента: каждая пара =XX (например, =C3=A8 для è) преобразуется обратно в исходный байт, а завершающий = перед символом новой строки удаляется полностью, объединяя две строки в одну.

Когда это использовать?

Используйте quoted_printable_decode(), когда работаете с необработанными письмами — например, при разборе сообщения, полученного из почтового ящика IMAP, чья часть помечена как Content-Transfer-Encoding: quoted-printable. Эта функция является обратной к quoted_printable_encode(), которую вызывают перед отправкой подобного содержимого.

Несколько важных моментов:

  • Она не меняет кодировку символов. Декодирование =C3=A8 даёт необработанные байты UTF-8 для è; результат верен только если обрабатывать вывод как UTF-8. Функция ничего не знает о кодировках — она просто обращает шестнадцатеричное экранирование.
  • Encoded-word заголовки — другой формат. Строки темы вида =?UTF-8?Q?...?= используют похожий, но отличный формат; для их декодирования используйте mb_decode_mimeheader() или iconv_mime_decode().
  • Некорректный ввод допускается. Случайный =, за которым не следует допустимый шестнадцатеричный код, оставляется как есть, поэтому некорректные данные не вызовут ошибки.

Связанные функции

  • quoted_printable_encode() — функция кодирования.
  • mail() — отправка электронной почты из PHP.
  • utf8_encode() — преобразование текста ISO-8859-1 в UTF-8.
  • PHP Strings — обзор работы со строками в PHP.

Практика

Практика
Что делает функция quoted_printable_decode() в PHP?
Что делает функция quoted_printable_decode() в PHP?
Was this page helpful?