不管怎样,我将 VT320 连接到了 Linux 机器上。我试图运行一些软件,但每当渲染一些表情符号时,串行连接似乎就会陷入崩溃状态。
不确定这是否重要,但在这种情况下它是 🎲(死)表情符号。相反,我得到了一个镜像问号,终端没有呈现任何其他内容。
我知道表情符号永远都行不通。我愿意接受一个错误的字符或根本没有字符,但我想知道是否有可能避免冻结连接。
如果相关的话,这就是 agetty 在 中的配置方式。我选择了 VT220,因为它与我拥有的最为接近。/lib/systemd/system/[email protected]
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,您已发送“应用程序命令”(ESC _ 或 \x9f)和“G2 字符集的单 Shift 选择”(ESC N 或 \x8e)。(名称来自
xterm
文档。)前者几乎肯定是罪魁祸首。我尝试运行printf '\e_'
(或命令输出 \x9f)并得到您描述的行为(在 xterm 和 /bin/sh 中),直到输出“字符串终止符”(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'
以消除 8 位字符,但这会导致输出延迟。您可以使用虚拟终端执行相同操作,但您需要一个类似screen
、tmux
或expect
(或更简单的程序)的程序来驱动它。编辑:今天早上我尝试编写一个简单的 C 驱动程序。花了大约 2 个小时。它有最低限度的错误检查。我将其命名为“no-utf8.c”。您可以在在线试用!处查看/获取它,尽管它在那里“不起作用”。将要执行的命令作为参数传递,例如
no-utf8 xinput
或no-utf8 bash
或no-utf8 printf '\x9fnormally hidden \x9cok\n'
。VT320 文档指出,虽然有一种方法可以选择终端是否应向主机发送 7 位或 8 位控制字符,但终端本身始终接受来自主机的 8 位控制字符,除非配置为 VT100 兼容模式。那么也许可以尝试一下?执行
根据此,这是将 DEC 终端置于 VT100 模式的控制序列。