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-printable | Base64 |
|---|---|---|
| Тип данных | Текст с преобладанием 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 →