Вопрос или проблема
Так или иначе, я подключил свой VT320 к машине с Linux. Я пытаюсь запустить на нем некоторое программное обеспечение, но, похоже, serial соединение оказывается в сбойном состоянии всякий раз, когда отображаются некоторые эмодзи.
Не уверен, важно ли это, но в данном случае это был эмодзи 🎲 (кубик). Вместо этого я получаю перевернутый знак вопроса, и терминал больше ничего не отображает.
Я знаю, что эмодзи никогда не будет работать. Я бы согласился на неправильный символ или на отсутствие символа вовсе, но хотел бы знать, возможно ли избежать зависания соединения.
Если это имеет значение, вот как 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), что нарушает работу терминала. Такие команды предназначены для контроля особенностей поведения терминала и могут переводить устройство в нестабильный или неуправляемый режим до тех пор, пока не будет выслана корректная последовательность символов, завершающая сбой.
Применение
Решения проблемы:
-
Изменение кодировки: Самое очевидное решение – это запретить использование кодировки UTF-8 в сеансе терминала, поскольку VT320 не поддерживает такие кодировки.
- Можно установить языковую переменную среды на
LANG=C
, чтобы предотвратить использование UTF-8 запуском следующей команды:export LANG=C
Это скажет вашим программам не предполагать UTF-8 вывод.
- Можно установить языковую переменную среды на
-
Конфигурация
stty
:- Используйте
stty
, чтобы настроить управление установленными битами. Попробуйте такие команды, чтобы избежать передачи 8-битных данных:stty cs7 parenb -parodd
Это приведет к использованию 7 битов вместо 8 и устранит проблемы с паритетом.
- Используйте
-
Фильтрация вывода: Вы можете использовать потоковые редакторы для удаления восьмибитных символов, которые могут вызвать сбой вашего терминала.
- Используйте команду
sed
для фильтрации неподдерживаемых восьмибитных данных.sed -e 's/[\x80-\xff]/?/g'
Это преобразует неподдерживаемые символы в вопросительные знаки, предотвращая сбои.
- Используйте команду
-
Использование промежуточных инструментов: Для продвинутых трансформаций вывода используйте инструменты виртуальных терминалов, такие как
screen
илиtmux
.- Эти инструменты могут обрабатывать вывод с вашего хоста, интерпретируя и преобразовывая сложные символы в допустимые для VT320, фильтруя выходной поток до того, как он пройдет через физический терминал.
-
Мониторинг терминального вывода:
- Тестируйте комбинации через
printf
для анализа режима ожидания и готовности терминала отправить "String Terminator" (например,ESC \
или\x9c
), возвращая термальный в нормальное управление. Используйте это для восстановления, когда терминал заходит в неуправляемый режим после отображения неподдерживаемых символов.
- Тестируйте комбинации через
Заключение
Поддержка устаревших аппаратных средств требует соблюдения некоторых ограничений и использования надлежащих техник для обеспечения его штатной работы. Часто возникающие проблемы с эмодзи на старых терминалах могут быть сведены к минимуму за счет точной настройки среды и фильтрации ввода. Эти методы помогают предотвратить такие эксцессы, обеспечивая надежное взаимодействие со stty
и sed
, с дополнительной поддержкой со стороны программных инструментов управления, как screen
и tmux
, в случае крайней необходимости.