Открыть сервис

Quoted-printable

Quoted-printable — это кодировка передачи содержимого (транспортная кодировка), предназначенная для представления произвольных двоичных данных, в первую очередь текстовых сообщений, в виде последовательности символов, состоящих только из печатных символов американского стандартного кода обмена информацией (ASCII). Основная цель quoted-printable — обеспечить корректную передачу данных через каналы связи и почтовые системы, которые могут искажать или неправильно интерпретировать символы, выходящие за пределы стандартного набора ASCII (например, символы кириллицы, умлауты, символы национальных алфавитов), а также управляющие символы и специальные знаки.

Кодировка определена в стандарте Multipurpose Internet Mail Extensions (MIME), в частности, в документе RFC 2045 (и его предшественнике RFC 1521). Она является одной из двух основных транспортных кодировок, наряду с Base64, и ориентирована на случаи, когда передаваемые данные преимущественно состоят из символов латиницы и содержат лишь небольшое количество «опасных» или не-ASCII символов.

Принцип работы

В основе quoted-printable лежит принцип замены символов, которые не могут быть безопасно переданы в семибитной среде (SMTP, многие старые протоколы), на их шестнадцатеричный код, предварённый знаком равенства (=). Допустимыми (без кодирования) считаются:

  • Печатные символы ASCII с кодами от 33 до 126, кроме символа равенства (=) (код 61).
  • Символ табуляции (код 9).
  • Символ пробела (код 32), за исключением случая, когда пробел находится в конце строки.

Все остальные символы, включая символы с кодами от 128 до 255 (например, буквы кириллицы в кодировках Windows-1251 или KOI8-R), а также управляющие символы (кроме табуляции) и сам знак равенства, должны быть закодированы в виде последовательности =XX, где XX — шестнадцатеричное представление кода символа (заглавные буквы A–F). Например:

  • Символ «А» (кириллица, код 192 в Windows-1251) кодируется как =C0.
  • Символ «©» (код 169) — как =A9.
  • Символ «=» (код 61) — как =3D.

Правила форматирования строк

Для совместимости со старыми почтовыми системами, которые ограничивают длину строки (обычно не более 76 или 1000 символов), quoted-printable использует механизм «мягкого» переноса строки. Если строка становится слишком длинной, в конце строки ставится знак равенства (=), а сама строка переносится. При декодировании такой перенос игнорируется, и строка восстанавливается как непрерывная. Например: `` Это длинная строка, которая будет раз= бита на две части. `` При декодировании получится: «Это длинная строка, которая будет разбита на две части.»

Также существуют правила для кодирования пробелов и табуляции в конце строки — они обязательно заменяются на =20 и =09 соответственно, чтобы избежать их потери при передаче.

История и контекст появления

Quoted-printable была разработана в начале 1990-х годов как часть спецификации MIME (RFC 1341, затем RFC 1521, RFC 2045–2049). До появления MIME электронная почта в Интернете (протокол SMTP) могла передавать только текст, состоящий из 7-битных символов ASCII. Любые попытки отправить письмо с символами кириллицы, немецкими умлаутами или вложениями (файлы) приводили к их искажению или потере.

MIME ввёл понятие транспортных кодировок, которые позволяли «упаковать» 8-битные данные (например, текст в кодировке UTF-8 или Windows-1251) в 7-битную форму. Quoted-printable была выбрана как оптимальный вариант для текстовых сообщений, где большая часть символов — латиница, а не-ASCII символы встречаются редко. В отличие от Base64, которая превращает весь поток данных в нечитаемую для человека последовательность символов, quoted-printable сохраняет читаемость исходного текста (за исключением редких закодированных фрагментов). Это упрощает отладку и просмотр исходного кода письма.

Применение

Основная область применения quoted-printable — электронная почта. Она используется в заголовках (например, в полях Subject:, From:, To:) для передачи не-ASCII символов (в сочетании с указанием кодировки, например, =?UTF-8?Q?=D0=A2=D0=B5=D0=BC=D0=B0?=) и в теле письма (в Content-Transfer-Encoding: quoted-printable).

Кроме того, quoted-printable применяется:

  • В некоторых текстовых протоколах (например, в HTTP при передаче данных в формате application/x-www-form-urlencoded используется похожий, но не идентичный механизм).
  • В форматах файлов, где требуется сохранить читаемость текста (например, в некоторых конфигурационных файлах).
  • В системах, где необходимо передавать данные через каналы, чувствительные к управляющим символам.

Преимущества и недостатки

Преимущества

  • Читаемость: в отличие от Base64, большая часть текста остаётся читаемой для человека (если текст написан на латинице). Это удобно для отладки и ручной обработки.
  • Эффективность для текста: если текст содержит лишь небольшое количество не-ASCII символов, размер закодированных данных увеличивается незначительно (на 1–3% на каждый не-ASCII символ). Для сравнения, Base64 увеличивает размер данных примерно на 33% независимо от содержания.
  • Совместимость: гарантирует прохождение через любые 7-битные каналы, включая старые почтовые системы и шлюзы.

Недостатки

  • Неэффективность для двоичных данных: если передаваемые данные содержат много не-ASCII символов (например, изображения, архивы), quoted-printable становится крайне неэффективной — каждый байт (кроме латинских букв и цифр) превращается в три символа (=XX), что увеличивает размер данных в 2–3 раза. Для таких данных предпочтительнее Base64.
  • Чувствительность к длине строки: необходимость «мягкого» переноса строк усложняет обработку и может привести к ошибкам при неправильной реализации.
  • Ограниченная поддержка в современных системах: хотя все современные почтовые клиенты поддерживают quoted-printable, многие из них автоматически выбирают Base64 для текстов с большим количеством не-ASCII символов.

Сравнение с Base64

ХарактеристикаQuoted-printableBase64
Тип данныхТекст с преобладанием ASCIIЛюбые двоичные данные
ЧитаемостьВысокая (для латиницы)Низкая (полностью кодирует)
Увеличение размераОт 0% до ~200% (зависит от содержания)~33% (фиксированно)
ПрименениеТекст, заголовки писемВложения, изображения, архивы
Сложность реализацииСредняя (из-за правил переноса строк)Низкая

Пример кодирования и декодирования

Исходный текст (UTF-8): Привет, мир!

Закодированный текст (quoted-printable, UTF-8): `` =D0=9F=D1=80=D0=B8=D0=B2=D0=B5=D1=82, =D0=BC=D0=B8=D1=80! ``

Декодирование: Последовательность =D0=9F декодируется в два байта 0xD0 и 0x9F, которые в UTF-8 представляют символ «П». Аналогично декодируются остальные символы. Пробел (код 32) остаётся незакодированным.

Интересные факты

  • Название «quoted-printable» происходит от того, что символы, которые нужно закодировать, «заключаются в кавычки» (quotes) в виде знака равенства и шестнадцатеричного кода.
  • В спецификации RFC 2045 указано, что строки quoted-printable не должны превышать 76 символов (включая =XX и знак = для мягкого переноса). Это требование связано с ограничениями некоторых старых почтовых серверов.
  • Quoted-printable часто используется в заголовках писем для передачи тем, написанных на русском или других языках. Например, тема письма «Тема письма» может быть закодирована как =?UTF-8?Q?=D0=A2=D0=B5=D0=BC=D0=B0_=D0=BF=D0=B8=D1=81=D1=8C=D0=BC=D0=B0?=.

Источники

  • RFC 2045 (Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies)
  • RFC 1521 (MIME (Multipurpose Internet Mail Extensions) Part One: Mechanisms for Specifying and Describing the Format of Internet Message Bodies) — предшественник RFC 2045
  • RFC 1341 (MIME (Multipurpose Internet Mail Extensions): Mechanisms for Specifying and Describing the Format of Internet Message Bodies) — первый стандарт MIME
  • Спецификация протокола SMTP (RFC 2821, RFC 5321)

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →