Конвертер кодировок текста

Декодер писем: =?UTF-8?B?…?=, quoted-printable и Base64

Почтовые стандарты появились, когда письма могли передавать только латинские буквы. Поэтому всё остальное — русская тема, имя отправителя, название вложения, а часто и сам текст — перед отправкой записывается латиницей по особым правилам. Почтовая программа незаметно возвращает тексту обычный вид. Но если открыть исходный текст письма, получить письмо через скрипт или столкнуться с программой, которая ошиблась при разборе, видны строки вроде =?UTF-8?B?0J/RgNC40LLQtdGC?=. Декодер выше превращает их обратно в текст.

Что умеет декодер

  • Заголовки целиком. Можно вставить сразу несколько строк из исходного текста письма — Subject, From, To. Закодированные фрагменты раскодируются, остальное останется как было.
  • Имена вложений в обеих записях: filename="=?UTF-8?B?...?=" и filename*=utf-8''%D0%9E%D1%82..., включая длинные имена, разбитые на части filename*0*=, filename*1*=.
  • Текст письма в quoted-printable (=D0=9F=D1=80=D0=B8...) и в Base64 (длинные строки из латиницы и цифр). Кодировку текста можно выбрать или оставить определение автоматически.
  • Обратное преобразование: кнопка «Закодировать тему письма» превращает русский текст в строку =?UTF-8?B?...?= для скрипта рассылки, разбивая длинную тему на части по правилам стандарта.

Как читать строку =?…?=

Закодированный фрагмент состоит из трех частей, разделенных вопросительными знаками: кодировка текста, способ записи и сами данные.

ФрагментКодировкаСпособТекст
=?UTF-8?B?0J/RgNC40LLQtdGC?=UTF-8B — Base64Привет
=?UTF-8?Q?=D0=9F=D1=80=D0=B8=D0=B2=D0=B5=D1=82?=UTF-8Q — коды байтов через «=»Привет
=?windows-1251?B?z/Do4uXy?=Windows-1251B — Base64Привет
=?koi8-r?B?8NLJ18XU?=KOI8-RB — Base64Привет

Длинная тема делится на несколько фрагментов подряд: стандарт ограничивает длину каждого 75 символами. При этом одна русская буква в UTF-8 может оказаться разрезанной между двумя фрагментами — декодер склеивает их перед раскодированием, поэтому такие буквы не превращаются в «�».

Где взять исходный текст письма

  • Gmail: в меню письма (три точки) — «Показать оригинал».
  • Outlook (классическая версия): откройте письмо, затем «Файл» → «Свойства» — заголовки находятся в поле «Заголовки Интернета».
  • Thunderbird: сочетание клавиш Ctrl+U открывает исходный текст сообщения.
  • Файл .eml — это и есть исходный текст: откройте его в Блокноте.

Если после раскодирования вместо букв получилось «РџСЂРёРІРµС‚» или похожие кракозябры, значит, отправитель указал в письме не ту кодировку. Скопируйте результат в конвертер кодировок — он определит настоящую кодировку. Подробнее о таких письмах — в инструкции «Кракозябры в электронном письме».

Как раскодировать в программах

ГдеЗаголовок =?…?=Текст в quoted-printable
Python 3str(email.header.make_header(email.header.decode_header(s)))quopri.decodestring(b).decode('utf-8')
PHPiconv_mime_decode($s, 0, 'UTF-8') или mb_decode_mimeheader($s)quoted_printable_decode($s)

Для обратной задачи в PHP есть mb_encode_mimeheader($subject, 'UTF-8', 'B'), а в Python — email.header.Header(subject, 'utf-8').encode(). Современные библиотеки отправки почты кодируют заголовки сами, достаточно передать им текст в UTF-8.

Частые вопросы

Чем способ B отличается от Q?
Оба записывают одни и те же байты, только по-разному. B (Base64) компактнее для русского текста, поэтому почтовые программы обычно выбирают его. Q похож на quoted-printable: латинские буквы остаются как есть, остальные байты записываются как =D0=9F, а пробел — знаком «_». Декодер понимает оба способа.
Почему тема письма приходит как =?UTF-8?B?...?= и не раскодируется?
Почтовая программа не узнала закодированный фрагмент — чаще всего из-за ошибки отправителя: внутри фрагмента оказался пробел, перевод строки или фрагмент длиннее допустимого. Раскодировать такую тему можно здесь, а исправить причину может только отправитель — например, разработчик сайта, который рассылает письма.
Отправляются ли письма или заголовки на сервер?
Нет. Раскодирование выполняется в вашем браузере, текст никуда не передается. Это важно, если в заголовках есть адреса и имена.
Что такое строки «Content-Transfer-Encoding: base64» и «quoted-printable» в письме?
Это указание, как записан текст письма или вложение. При base64 текст выглядит как длинные строки из латиницы и цифр, при quoted-printable — как обычный текст с кодами вида =D0=9F вместо русских букв. Скопируйте часть письма после пустой строки, идущей за этим заголовком, и вставьте в декодер.