我的终端仿真器应该如何处理 DC1 控制代码?

我的终端仿真器应该如何处理 DC1 控制代码?

我正在编写一个与 ansi 兼容的终端仿真器,并且按照遇到的顺序实现不同的控制代码。使用时的一个奇怪之处lynx是过多的DC1/XON控制代码 ( 0x11)。但他们实际上并不打算那些控制代码。我注意到LXTerminal它们是用箭头字形渲染的,并且 lynx 中整个页面的布局表明他们打算以这种方式工作。

是否有一个众所周知的规范或参考实现指定0x11为可打印字符而不是DC1

编辑:

这个圆圈箭头是 xterm 为该代码输出的内容,但我不确定为什么,当我的编码是UTF-8时,DC1应该以这种方式输出。

在此输入图像描述

答案1

如果您看到controlQ(0x11) 和 controlS(0x13),则这些是 XON/XOFF:流量控制的伪影。仅当您的连接表明它依赖于软件流控制时,您才应该看到这些内容;终端驱动程序可以将它们发送到设备(就像用户可以按这些键来控制另一个方向一样)。

进一步阅读:

关于“布局”的评论山猫是模糊的:

  • 0x11 不是任何能想到的字符集中的空白字符。
  • 看着字符集Lynx 知道,没有人将 0x11 显示为非打印字符。
  • 显示字符集可在选项菜单
  • 由于区域设置和显示字符集的一些奇怪组合,Lynx 只会将其用作可打印字符。

由于缺乏有关 Lynx 为何可能使用 0x11 作为非打印字符的一些详细信息,听起来好像终端驱动程序正在使用相当小的缓冲区发送 XON/XOFF。

跟进评论(哪个终端正在使用TERM=ansi?屏幕截图显示xterm),lynx可以写(使用诅咒)左箭头,例如字符ACS_LARROW。在里面源代码,看起来像这样:

    /*
     * 现在绘制左侧滚动指示器,以避免复杂化
     * 覆盖可能位于第一列的多列字符的一部分
     * 位置。
     */
    如果(IsPanned && lft_cells){
        CTRACE_EDIT((tfp, "绘制左滚动指示器\n"));
        TmpStyleOn(提示? s_prompt_edit_arr : s_aedit_arr);
        LYmove(StartY, StartX);
        LYaddch(ACS_LARROW);
        TmpStyleOff(提示? s_prompt_edit_arr : s_aedit_arr);
        lft_shift = 1;
    }

现在...lynx它自己只知道以下定义<curses.h>

#define ACS_LARROW      NCURSES_ACS(',') /* arrow pointing left */

而终端描述为“安西”给出实际映射klone+acs:

acsc=+\020\,\021-\030.^Y0\333`\004a\261f\370g\361h\260j\331k\277l\332m\300n\305o~p\304q\304r\304s_t\303u\264v\301w\302x\263y\363z\362{\343|\330}\234~\376,

幸运的是(为了可读性),您感兴趣的映射是将逗号(转义)映射到八进制 021 的第二个条目:

    \,\021

这就是你的 DC1(八进制 021 是十六进制 0x11)。但该映射并未用于xterm。的画线字符xterm(除非使用 UTF-8,其中 ncurses 会忽略终端描述)不包括左箭头。该映射定义在xterm-basic,你可以看到它没有逗号(末尾的逗号是分隔符):

acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,

xterm 手册建议 的有用值TERM,并且“ansi”(尽管在列表中)并不是第一个。它已经存在了一段时间(早于 ncurses):

   Terminal  database (terminfo (5) or termcap (5)) entries that work with
   xterm include

          an optional platform-specific entry ("xterm-new"),
          "xterm",
          "vt102",
          "vt100",
          "ansi" and
          "dumb"

例如,我在 X11R5 (1993) 中看到了它。但是却被介绍了早些时候,出现在 X10R4 (1986) 中。我怀疑终端模拟器中“ansi”的含义在 30 年来发生了轻微的变化(它对应于ANSI.SYS,这与 xterm 等不同)。使用"xterm"(或者"xterm-new"),你会得到更好的结果。

答案2

我找到了一个网页,其中控制字符给出了与您的发现相匹配的可打印表示形式:

http://xhelmboyx.tripod.com/formats/latin-mac-charset.txt

 1         0x01     SOH start head             white smiley
 2         0x02     STX start text         ->| or black smiley
 3         0x03     ETX end text              |<- or heart
                                               _
 4         0x04     EOT end transmit           ^ or diamond
 5         0x05     ENQ enquiry              up arrow or club
 6         0x06     ACK acknowledge             ^ or spade
 7         0x07     BEL bell/beep               centre dot
 8         0x08     BS backspace           inverted text cursor
 9         0x09     HT horizontal tab           vert. oval
10         0x0A     LF line feed           |X> or inverted oval
11         0x0B     VT vertical tab         arrow or male symbol
12         0x0C     FF form feed           arrow or female symbol
13         0x0D     CR carriage return       single note symbol
14         0x0E     SO shift out              dual note symbol
15         0x0F     SI shift in                  sun symbol
16         0x10     DLE device link esc      down or right arrow
17         0x11     DC1 device control 1         left arrow
18         0x12     DC2 device control 2   tick or dual vert arrow
19         0x13     DC2 device control 3   diamond or dual exclamation
20         0x14     DC4 device control 4         pilcrow sign
21         0x15     NAK negative acknowl.       section symbol
22         0x16     SYN sync. idle              horizontal bar
23         0x17     ETB end trans. block    <X| or dual vert arrow underscored
24         0x18     CAN cancel                 left or up arrow
25         0x19     EM end medium              up or down arrow
26         0x1A     SUB substitute               right arrow
27         0x1B     ESC escape                   left arrow
28         0x1C     FS file separator              |____
29         0x1D     GS group separator       dual horizontal arrow
30         0x1E     RS record separator            up arrow
31         0x1F     US unit separator             down arrow

相关内容