VT320 через ttyUSB0 выходит из строя при столкновении с эмодзи.

Вопрос или проблема

Так или иначе, я подключил свой VT320 к машине с Linux. Я пытаюсь запустить на нем некоторое программное обеспечение, но, похоже, serial соединение оказывается в сбойном состоянии всякий раз, когда отображаются некоторые эмодзи.

Изображение VT320 в сбойном состоянии

Не уверен, важно ли это, но в данном случае это был эмодзи 🎲 (кубик). Вместо этого я получаю перевернутый знак вопроса, и терминал больше ничего не отображает.

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

Если это имеет значение, вот как agetty настроен в /lib/systemd/system/[email protected]. Я выбрал VT220, так как это самое близкое к тому, что у меня есть.

ExecStart=-/sbin/agetty -h -L 19200 %I vt220

Вывод stty -a:

speed 19200 baud; rows 24; columns 80; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = <undef>;
rprnt = <undef>; werase = <undef>; lnext = <undef>; discard = <undef>;
min = 1; time = 0;
-parenb -parodd -cmspar cs8 hupcl -cstopb cread clocal crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon ixoff
-iuclc -ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon -iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
-echoctl echoke -flusho -extproc

Проблема почти наверняка в том, что UTF-8 занимает много места в пространстве символов C1. Это управляющие команды для классического терминала, и они могут переводить его в странные режимы.

В данном случае, отправляя U+1F3B2, вы отправили “Application Program Command” (ESC _ или \x9f), и “Single Shift Select of G2 Character Set” (ESC N или \x8e). (Названия из документации xterm.) Первое, скорее всего, является виновником. Я пытался выполнить printf '\e_' (или команды на вывод \x9f) и получил описанное вами поведение (в xterm и /bin/sh) до вывода “String Terminator” (ESC \ или \x9c).

Я подозреваю, что первый очевидный шаг – это сообщить вашему хостинговому программному обеспечению, что вы не используете терминал UTF-8. Возможно, export LANG=C.

Если это не сработает, вы можете указать терминалу игнорировать паритет 7 бит или сказать хосту не генерировать его (режимы stty, возможно, комбинация cs7, parenb, parodd и cmspar (и не забудьте попробовать варианты с -)), или и то, и другое.

Вы можете попробовать перенаправить вывод через что-то вроде sed -e 's/[\x80-\xff]/?/g' или sed -e 's/[\x80-\xbf]//g;s/[\xc0-\xff]/?/g', чтобы избавиться от восьмибитных символов, но это имеет проблемы с задержкой вывода. Вы можете сделать то же самое с виртуальным терминалом, но вам потребуется программа, такая как screen, tmux или expect (или что-то более простое), чтобы управлять им.

Ответ или решение

Теория

Терминал DEC VT320 представляет собой интеллектуальное устройство отображения текстовой информации, широко использовавшееся в прошлом, и он типично полагается на более простые текстовые кодировки, такие как ASCII. В отличие от современных терминалов, основанных на графической среде, таких как GNOME Terminal или iTerm, он не рассчитан на работу с многобайтовыми символами и кодировкой UTF-8, используемой для отображения таких сложных символов, как эмодзи. Эмодзи требует увеличенного набора символов превышающего базовый ASCII, что приводит к искажению или сбою отображения на старых устройствах. Это объясняется тем, что многобайтовые последовательности данных UTF-8 попадают в диапазоны, зарезервированные для управляющих команд в C1 и других областях.

Пример

Вы отметили, что при попытке отобразить эмодзи 🎲 (в кодировке Unicode как U+1F3B2) терминал перешел в архиважный режим и перестал отвечать на команды. При этом отображался зеркально перевернутый вопросительный знак. Это происходит из-за того, что в процессе обработки символов происходят сопоставления с управляющими командами, такими как "Application Program Command" (ESC _ или \x9f), что нарушает работу терминала. Такие команды предназначены для контроля особенностей поведения терминала и могут переводить устройство в нестабильный или неуправляемый режим до тех пор, пока не будет выслана корректная последовательность символов, завершающая сбой.

Применение

Решения проблемы:

  1. Изменение кодировки: Самое очевидное решение – это запретить использование кодировки UTF-8 в сеансе терминала, поскольку VT320 не поддерживает такие кодировки.

    • Можно установить языковую переменную среды на LANG=C, чтобы предотвратить использование UTF-8 запуском следующей команды:
      export LANG=C

      Это скажет вашим программам не предполагать UTF-8 вывод.

  2. Конфигурация stty:

    • Используйте stty, чтобы настроить управление установленными битами. Попробуйте такие команды, чтобы избежать передачи 8-битных данных:
      stty cs7 parenb -parodd

      Это приведет к использованию 7 битов вместо 8 и устранит проблемы с паритетом.

  3. Фильтрация вывода: Вы можете использовать потоковые редакторы для удаления восьмибитных символов, которые могут вызвать сбой вашего терминала.

    • Используйте команду sed для фильтрации неподдерживаемых восьмибитных данных.
      sed -e 's/[\x80-\xff]/?/g'

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

  4. Использование промежуточных инструментов: Для продвинутых трансформаций вывода используйте инструменты виртуальных терминалов, такие как screen или tmux.

    • Эти инструменты могут обрабатывать вывод с вашего хоста, интерпретируя и преобразовывая сложные символы в допустимые для VT320, фильтруя выходной поток до того, как он пройдет через физический терминал.
  5. Мониторинг терминального вывода:

    • Тестируйте комбинации через printf для анализа режима ожидания и готовности терминала отправить "String Terminator" (например, ESC \ или \x9c), возвращая термальный в нормальное управление. Используйте это для восстановления, когда терминал заходит в неуправляемый режим после отображения неподдерживаемых символов.

Заключение

Поддержка устаревших аппаратных средств требует соблюдения некоторых ограничений и использования надлежащих техник для обеспечения его штатной работы. Часто возникающие проблемы с эмодзи на старых терминалах могут быть сведены к минимуму за счет точной настройки среды и фильтрации ввода. Эти методы помогают предотвратить такие эксцессы, обеспечивая надежное взаимодействие со stty и sed, с дополнительной поддержкой со стороны программных инструментов управления, как screen и tmux, в случае крайней необходимости.

Оцените материал
Добавить комментарий

Капча загружается...