Безопасное игнорирование неизвестных последовательностей ANSI, ESC/P, ESC/POS, знание длины

Сначала немного контекста:
я делаю устройство, которое превращает электронную пишущую машинку в последовательный принтер/терминал.(не спрашивайте зачем, я знаю, что это практически не имеет смысла)
Устройство вставляется между контроллером машинки и ее клавиатурой.
Может:

  • пропустить клавиатуру, прозрачно,
  • получать нажатия клавиш, с блокировкой или без блокировки пишущей машинки от их просмотра,
  • вставить дополнительные нажатия клавиш.

При этом я могу заставить машинку работать в разных режимах:

  • нормальная машинка,
  • пишущая машинка с регистрацией каждого набранного символа через последовательный порт,
  • последовательный принтер,
  • серийный терминал.

Для режимов последовательного принтера/терминала я хочу принять и понять некоторые escape-последовательности ANSI (для терминала), ESC/P, ESC/POS (для принтера) в зависимости от режима.

И тут возникает проблема. Поскольку устройство ограничено, можно принять очень небольшое подмножество escape-последовательностей, которые можно выполнить на пишущей машинке. Я хочу просто игнорировать любые неподдерживаемые последовательности.
Проблема в том, что последовательности имеют разную длину.
Когда приходит нераспознанная (устройством) последовательность, есть ли общий способ определить, сколько байтов будет последовательность, чтобы я знал, сколько символов игнорировать? (например, некоторые простые правила, основанные на первых символах?)
Или я вынужден подготовить длинную таблицу поиска (которая занимает драгоценное место во флэш-памяти) для всех возможных последовательностей, чтобы всегда знать, сколько байтов игнорировать?

Я хочу избежать:

  • игнорирование фактических действительных данных, которые идут после последовательности, и не печать их
  • печать частей управляющих последовательностей на бумаге
  • интерпретация частей неизвестных последовательностей как начало новой последовательности

Конечно, я мог бы определить свои собственные последовательности, но тогда мне понадобился бы специальный драйвер для моего устройства. Я предпочитаю использовать существующий стандарт.

Отредактировано для добавления: как показывает @Raymond Chen в комментарии ниже, для последовательностей ANSI можно определить, где они заканчиваются. Так что нет проблем. Однако для последовательностей ESC/P (в режиме принтера) я не заметил подобного способа узнать это.

1 ответ

ESC/P и ESC/POS имеют спецификации EPSON, но они являются стандартами де-факто, а не стандартизированными.
Другие поставщики, отклоняющие их, не обязательно соблюдают их и часто делают свои собственные расширения.

Сама EPSON сделала различные расширения, и есть такие спецификации, как ESC/P2, ESC/Page и ESC/Label (совместимость с Zebra-ZPL II?).

Например, ESC/POS находится здесь.
Справочник по командам ESC/POS для принтеров TM

А вот ESC/P.
Справочное руководство EPSON ESC/P

Если вы посмотрите в другом месте, вы найдете их.
ESC/P — Википедия Команды ESC
/P 2 и FX
Справочное руководство по командам ESC/Label — Epson
Esc/Pageコマンドリファレンス第4版Требуется регистрация участника.


Существуют свободные эвристические форматы их интерпретации, но не будет строго стандартизированных правил, применимых ко всем.

Хотите ли вы постоянно интерпретировать все задокументированные команды или поддерживать их в определенной степени и отказаться от деталей, у вас есть много вариантов.

Есть такой инструмент, который, вероятно, известен.
Инструменты командной строки ESC/POS

Включенные утилиты
esc2text
esc2textизвлекает текст и разрывы строк из бинарных файлов ESC/POS.

Он еще не закончен, но я сам делаю такой инструмент.
EscPosUtils

Если поискать, найдутся и другие подобные инструменты.

Другие вопросы по тегам