Безопасное игнорирование неизвестных последовательностей 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
Если поискать, найдутся и другие подобные инструменты.