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Функция принимает один аргумент и возвращает декодированную строку.
| Параметр | Тип | Описание |
|---|---|---|
$string | string | Строка в формате quoted-printable для декодирования. |
Возвращаемое значение: декодированная 8-битная строка. Последовательности, не являющиеся допустимым quoted-printable, возвращаются без изменений, а не вызывают ошибку.
Базовый пример
Здесь =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.