为什么 xterm 的文档将 ' ' 称为控制字符?

Why do xterm's docs call ' ' a control character?

我正在使用 xterm 的文档作为指导为 ANSI 转义码编写解析器。在单字符函数列表下,它们包括:

SP Space.

现在,对于大多数单字符函数,我理解其目的:例如,BEL 将需要终端仿真器的一些特殊帮助来处理,而 TAB 是可能涉及自动完成而不是作为普通字符打印。

我无法想象在任何情况下 SP 需要被视为文字 space 字符以外的任何内容,因此我正在考虑删除 SP 控制代码从我的解析器。我这样做会冒任何风险吗?控制台中是否有我不知道的 SP 的用途?

ECMA 48 阐明了这一点。

tl;博士:

  • 有些终端可能会选择区分擦除的字符和space个字符。
  • 在具有可变宽度字体的终端中,SP 可被视为引入可配置水平间距量的控制字符。

今天这两个都无关紧要,因此您可以完全自由地将其视为另一个角色。

ECMA 48 第 6.1.1 节:

Depending on the implementation, there may or may not be a distinction between a character position in the erased state and a character position imaging SPACE

ECMA 48 第 8.3.140 节:

SSW is used to establish for subsequent text the character escapement associated with the character SPACE. The established escapement remains in effect until the next occurrence of SSW in the data stream or until it is reset to the default value by a subsequent occurrence of CARRIAGE RETURN/LINE FEED (CR/LF), CARRIAGE RETURN/FORM FEED (CR/FF), or of NEXT LINE (NEL) in the data stream, see annex C.

Space 不是 "control" 字符。在 ASCII 中,控制字符是代码 0 到 31(space 是 32)和 127(DEL)。 POSIX 语言环境使用相同的数据,并非巧合。

它们被称为控制字符,因为它们允许主机(计算机)控制(告诉)终端执行功能而不是而不是简单地打印文本:

  • A space 在这方面实际上是 "printing" 因为(像所有其他 ASCII 字符一样),它将回车位置提前一列。当然在C语言中,space被当作非图形处理,这是一种不同的含义。 "Graphic" 个字符可见。
  • 相比之下,TAB 需要终端做一些特殊的事情:将托架位置移动一定量,具体取决于它当时恰好所在的位置。

"Carriage position"当然是指打印终端(比如最初开发Unix的终端),或者打字机。 "carriage"(名词)是移动 left/right 以允许终端(或打字机)沿线在不同位置打印的机制。 "Carriage controls" 依次指的是左右移动马车的控制字符(打印单个字符的副作用除外)。如果你用过打字机就很明显了...

XTerm Control Sequences, SP is shown for clarity (to be able to reuse that name in other places, e.g., where a 32 is actually part of a control sequence). That wording was added in patch #25 中支持控制组 S7C1T、S8C1T 和 DECSCL 的描述 — 设置 ANSI 一致性级别,none 其中属于 ECMA-48。

快速检查显示 8 个 控制序列 包含一个 space(恰好是一个有效的 中间字节,根据 ECMA-48,就像分号一样,它在视觉上是不同的,并且不需要在控制序列描述中使用名称——您可能会发现 the PDF 比 HTML 更清楚). None 这些序列用于 ECMA-48 中提到的模糊含义:

  • ECMA 48 第 6.1.1 节讨论了在另一个字符上重写以呈现两者的混合。这在视频终端中很少见,但在大多数打印设备中都是假设的。在 terminfo 描述中最接近这个的可能是 ul(下划线字符重写),并且审查了几种可能性,其中一些 those 似乎是不正确的。 xterm 不会那样做。
  • ECMA 48 第 8.3.140 节在其关于 "character escapement" 的评论中指的是比例字体或可变宽度字符间距(同样,在视频终端中非常罕见,但在某些打印设备中实现)。有一些术语信息功能涉及 pitch,其中 all 标记为 "printer support"。 ncurses 有一个条目 (att5310) 使用 cpi 能力。

因此:如果您指的是 xterm 的文档,您不太可能打算将解析器用于视频终端以外的任何其他用途。但是,如果您希望它更通用,那么阅读有关打印机的内容将是改进您的应用程序的好方法。