为什么在 ASCII 控制字符的情况下,CTL-3/CTL-# 等于 CTL-[?(及其他)

为什么在 ASCII 控制字符的情况下,CTL-3/CTL-# 等于 CTL-[?(及其他)

当我摆弄一些终端仿真代码时,我重新发现了 ASCII 控制字符,并编写了一个小程序,输出我按下的每个键的十六进制值(tcsetattr() 和 ~ICANON)。

虽然我理解同时按下 Control 和 D 键 (CTL-D) 会生成 ASCII ^D/ EOT/0x04控制字符,以及WP ASCII页面上,我很惊讶地发现(至少在 OS X 上),一些其他意外的键也生成了控制字符:

CTL-2/@ = NUL = ^@ = 0x00 (expected actually)
CTL-3/# = ESC = ^[ = 0x1B
CTL-4/$ = FS = ^\ = 0x1C
CTL-5/% = GS = ^] = 0x1D
CTL-6/^ = RS = ^^ = 0x1E (expected actually)
CTL-7/& = CTL-/ = US = ^_ = 0x1F
CTL-8/* = DEL = ^? = 0x7F

请注意,CTL-1、-9 和 -0 不生成控制字符,只生成普通数字。

除了这两个预期字符(NUL 和 RS)之外,为什么终端会为这个数字键子集生成控制字符?

编辑:明确地说,我知道并理解 CTL-[=Esc,以及其他标准“插入符号”/控制键(^\、^]、^^、^_、^?)。我想知道为什么数字或 ^#、^$、^%、^&、^* 和 ^/ 控制键与它们重叠。

答案1

插入符号,如 ^D,实际上并不意味着 Ctrl-D。它表示“具有与字母的字母顺序相匹配的数字的 ASCII 控制字符”,在这种情况下,D=4,所以 ^D = 0x04。有些人认为将这些插入符号映射到 ctrl-X 方案的键盘字母会很好。显然,它在 27 或 0x1B 处中断,这时人们需要发挥创造力。

我的理解是,从来没有任何标准来映射优于 0x1A 的控制字符,并且各种历史实现已经共存了一段时间。

相关内容