Кратко

  • В декабре 1993 года RFC 1557 описал тело текстового письма с меткой ISO-2022-KR: начало в ASCII, назначение KSC 5601 последовательностью ESC $ ) C, переход к двухбайтным корейским знакам через SO и возврат к ASCII через SI.
  • Корейский текст заголовка представлялся как EUC-KR, а затем упаковывался в кодированное слово B или Q по RFC 1522. Тема и основной текст проходили разные процедуры чтения.

Заголовок прошёл пограничный контроль первым

Представим письмо о переносе встречи. Тема ясно сообщает новость, но новое время в теле выглядит как набор управляющих знаков. Адресат получил одно сообщение. Его почтовая программа должна была выполнить две операции, и одна из них дала сбой. Разница скрыта ровно там, где обычный читатель видит плавный переход от темы к содержанию.

Этот шов существовал в формате почты давно. RFC 822 отделял структурированные поля заголовка от тела пустой строкой. Адреса, знаки препинания и переносы строк в заголовке подчинялись собственному синтаксису. Промежуточные программы могли переставлять адресатов и заново переносить длинные строки. Тело сообщения обрабатывалось как протяжённый текст. Для корейских символов две области требовали разных приёмов.

U. Choi, K. Chon и H. Park изложили их в RFC 1557. По словам авторов, метод был установлен в 1991 году и широко применялся в корейских IP-сетях того времени. Документ, вышедший в декабре 1993 года, посвящён обычному тексту. Его главная инженерная черта — разделение: семибитный поток с переключениями для тела, другая кодировка в печатной ASCII-оболочке для заголовка.

Тело начинается с ASCII. Последовательность ESC $ ) C назначает набор KSC 5601, содержащий хангыль, ханча и другие символы. SO переводит декодер на пары байтов из этого набора; SI возвращает его к ASCII. Имя MIME-кодировки тела — ISO-2022-KR. Маленькие управляющие байты работают как стрелки на путях: дальнейший поезд байтов попадёт на выбранный участок. Если потерять указание стрелки, аккуратно сохранив вагоны, письмо всё равно может стать нечитаемым.

У RFC есть тонкость, важная для архивов. В пояснении назначающая последовательность привязана к началу строки перед SO. Формальная грамматика допускает одно назначение перед несколькими строками с корейским текстом; авторы прямо отдают ей приоритет при расхождении. При разборе старого письма надо следить за реально сохранившимися ESC $ ) C, SO и SI, а не переносить сюда правило обязательного назначения в каждой строке из иной схемы.

Тело остаётся семибитным, поэтому RFC не требует для него заголовка Content-Transfer-Encoding по этой причине. Авторы также замечали, что корейские почтовые программы их времени не поддерживали дополнительное наложение Base64 или Quoted-Printable на уже так закодированный текст. Это свидетельство об инструментах 1993 года. Метка ISO-2022-KR сообщает получателю, какую грамматику переключений применять к самому телу.

Выше пустой строки действует другой порядок. Корейские символы заголовка превращаются в байты EUC-KR, затем оформляются кодированным словом B или Q согласно RFC 1522. Оболочка имеет вид =?charset?encoding?encoded-text?=. Снаружи она состоит из печатного ASCII, который старые обработчики заголовков способны передать дальше; подготовленный читатель восстанавливает внутренний корейский текст. Заголовок предъявляет EUC-KR, тело — ISO-2022-KR. Общий декодер для обоих участков становится чиновником, который ставит верный штамп в чужой паспорт.

Когда обе процедуры выполнены, человек видит цельное письмо. История RFC 1557 напоминает, сколько невидимой работы потребовалось, чтобы тема и сообщение оказались рядом на одном экране.