ASCII 转义序列和控制字符配对是标准的一部分吗?

ASCII 转义序列和控制字符配对是标准的一部分吗?

转义序列与 ASCII 控制字符有常见的配对,例如 Ctrl-C 和 Ctrl-Z 分别与 ETX 和 SUB 配对。

在维基百科上控制代码页面上,有大多数配对,但没有引用的参考文献。

控制字符和按键序列配对是标准的一部分吗?

Linux 和其他操作系统的列表在哪里?

是否有列出这些配对的手册页?

它们纯粹是几十年来不成文的约定吗?

参考

答案1

配对是“拉丁字母”,从 1 到 26(还有 ASCII 的相关其余部分)。

Ctrl-C给出 ETX,字节值 3 ( 0x03, 000000011);C是 ASCII 67 ( 0x43, 010000011)。翻转第 7 位(加/减 64)以从一个到另一个。 SUB 是字节值 26,依此类推,如上所列你提到的维基百科页面按 1-26 和 AZ 的顺序排列。

其他 C0 控件对应于Ctrl和 其他非字母字符:NUL 是Ctrl-@,因为@是 ASCII 64,并且[(91) 对应于 ESC (27),依此类推,直到您按下空格。

ASCII码使用这些标签和(某种程度上)含义定义这些字节,就像 Unicode 和许多其他编码标准一样。使用 来Ctrl翻转该位是由终端或输入驱动程序决定的,但名称“控制字符”相当暗示了该配对是如何发生的。在遵循这一传统的任何系统上,它们在字母和字节之间都将具有相同的对应关系。

另一方面,至少在现代类 Unix 系统中,许多 ASCII 控件及其按键序列要么没有使用,要么用于与最初设想的不同目的。Ctrl-C并且Ctrl-D在效果上仍然相当并行,但Ctrl-V通常用于启动文字输入,而不是同步空闲,例如,我从未在野外见过组分隔符。

答案2

我在 1984 年写了一篇文档,总结了 ANSI 代码 X3.64-1979、ANSI X3.4-1977 和 ANSI X3.41-1974。这ansicode.txt描述控制代码如何影响 DEC LA 系列硬拷贝终端和 VT 系列视频终端。

答案3

法律上的标准化——也许没有

我们可以排除它是 POSIX 的一部分。POSIX 尝试避免要求完整的 ASCII 集或 ASCII 编码(数字值),此映射基于此。例如,POSIX 不需要您提到的 ETX 字符。在讨论用于的字符时,POSIX 也没有提及 Control-C / ETX 或 Control-Z / SUB 作为默认值。INTR 和 SUSP, 例如。

正如其他人指出的那样,Control 键行为不是本质上字符集/字符编码定义的一部分。看起来 Control 键映射未指定为 ASCII 的一部分。它似乎也不属于 ANSI 终端标准系列的一部分。

事实上的标准化 - VT100?

我认为您可以根据 VT100 / VT102 已成为事实上的标准来部分解释对这种行为的期望,尽管我预计这种行为早于它。看 ”终端使用什么协议/标准?

请参阅 VT102 用户指南,《传送的字符》->“功能键”->“控制字符键”。

图4-3显示生成控制字符的键。您可以通过两种方式生成控制字符。

  • 按住 CTRL 并按图 4-3 中任何无阴影的键。
  • 在不使用 CTRL 的情况下按图 4-3 中的任意阴影键。这些专用键无需使用 CTRL 即可生成控制字符。

表4-2列出键盘生成的控制字符。不同的计算机系统可能以不同的方式使用每个控制字符。

注意:VT102 生成的一些控制字符与以前的数字终端不同。表4-3列出更改。

我发现最后一条注释特别有趣。 VT102 对 NUL 使用 Control-space,而 Digital 的“以前的终端”则使用 Control-@。它还更改了最后两个 C0 控件(RS 和 US)的逃逸。 (我想知道这如何符合翻转第 7 位的模式)。VT100 还使用控制空间,所以我假设“以前的终端”指的是VT52家庭。

Linux内核

这不会在不同的硬件驱动程序中复制,例如 PS/2 键盘与 USB 键盘。相反,它是在VT层。看vt/keyboard.c。键盘修饰符(包括 Control)的状态保存在shift_state.然后使用移位状态来选择键盘映射。

param.shift = shift_final = (shift_state | kbd->slockstate) ^ kbd->lockstate;
param.ledstate = kbd->ledflagstate;
key_map = key_maps[shift_final];

https://elixir.bootlin.com/linux/v4.16.8/source/drivers/tty/vt/keyboard.c#L1393

因此,要了解更多信息,我认为您必须研究一下键位图由 VT 层使用。我假设 Control 的键映射已设置为产生您所描述的配对。

加载键手册页还提到了内核默认键映射。自手册页编写以来,此内容已被移动;它现在位于驱动程序/tty/vt/defkeymap.c_shipped。要阅读这些表,您必须知道用于索引的 Linux 键码。它们基于 QWERTY 键盘,因此字母既不是按字母顺序排列的,也不是连续的。看包括/uapi/linux/input-event-codes.h。或更好,这张桌子 它显示了键码和默认的控制映射。

相关内容