Кратко

  • RFC 1843, опубликованный в августе 1995 года, описал семибитный формат HZ для текста, в котором ASCII соседствует с китайскими знаками GB2312. Последовательность ~{ включает режим GB, ~} возвращает ASCII, а ~~ выводит саму тильду.
  • Базовый декодер читает поток байтов без правила о максимальной длине строки. Отдельно RFC советовал кодировщику держать физические строки короче 80 символов для программ вроде more: режим GB можно закрыть перед переносом и открыть снова после него, сохранив непрерывный восстановленный текст.

Маленький знак у дверей двух алфавитов

В электронной почте, выросшей вокруг ASCII, печатный байт уже имел привычный смысл. Китайскому иероглифу в наборе GB2312 требовались два байта, а машины к тому же не всегда одинаково представляли китайский текст внутри себя. Fung Fung Lee в описании HZ выбрал GB2312 общей основой для обмена и показал, как смешанный английский и китайский текст проходит по семибитным каналам. RFC вышел в 1995 году, но его аннотация уточняет: содержание совпадает со статьёй Lee с тем же названием, написанной в сентябре 1989-го. Идея успела пожить до того, как получила номер.

Декодер начинает в режиме ASCII. Обычные знаки идут прямо в результат, пока не встретится тильда. Тогда следующий символ становится инструкцией. ~~ означает одну видимую тильду; ~{ открывает режим GB; тильда непосредственно перед LF связывает физические строки и не добавляет символа в восстановленный текст. В режиме GB байты читаются парами, а ~} возвращает декодер к ASCII. Один и тот же числовой байт значит разное в зависимости от того, через какую дверь поток прошёл раньше. Декодеру приходится помнить лишь текущее состояние.

Почему для такой работы взяли именно тильду? RFC задаёт диапазон первого байта знака GB от шестнадцатеричного $21 до $77, а второго — от $21 до $7E. Значение тильды — $7E; оно находится за пределами диапазона первого байта. Поэтому команда переключения не выглядит началом обычного китайского знака. Типографская мелочь оказалась удачно расположенной на числовой карте.

Английская часть письма при этом осталась читаемой. Обычный ASCII не требует оболочки; удваивать нужно только тильду, если она должна появиться в тексте. Файл без китайских знаков и тильд выглядит как простой ASCII-файл. Внутри одного предложения можно войти в китайский фрагмент и затем выйти обратно. HZ рассчитан на эту смену, а не на одну огромную печать «всё письмо — китайское».

Есть и другая функция у тильды. Когда за ней сразу следует LF, декодер не выдаёт ни тильду, ни перевод строки. Отправитель может сложить длинную физическую строку, сохранив непрерывное предложение после декодирования. RFC 1843 прямо говорит, что базовому декодеру не нужно понятие строки. Весь файл может быть одной длинной строкой или вообще не содержать переводов строк. Достаточно знать режим и заглядывать на один символ вперёд. Согласованная всеми программами грамматика получилась узкой.

У терминала, в отличие от грамматики, есть ширина. Lee рекомендовал кодировщикам делать физические строки короче 80 символов, чтобы письмо удобно читалось в постраничных программах вроде Unix more. Если китайский фрагмент подходит к краю экрана, отправитель закрывает GB через ~}, вставляет тильду и LF для продолжения, а на следующей физической строке снова открывает GB через ~{. Байтов становится немного больше, но восстановленная фраза не обрывается. В RFC показаны разные расположения закодированного текста, которые дают один и тот же результат.

Это именно совет по записи, а не условие работы базового декодера. Один отправитель подстроится под узкий экран, другой оставит длинный поток; получатель сможет прочитать оба. Lee также отмечал, что при известном текущем режиме поток удобно просматривать в обратном направлении, в частности при обработке клавиши Backspace эмулятором терминала. Формат думал не только о доставке, но и о человеке, который редактирует письмо на экране.

RFC 1922 1996 года описал ISO-2022-CN для китайских интернет-сообщений с иными правилами обозначения и переключения на уровне строк. У HZ свой приём: простая двурежимная грамматика тильды и свобода укладывать физические строки вокруг неё. Семибитный канал никуда не расширился. Отправитель и получатель лишь договорились о коротких указателях на поворотах.