当我摆弄一些终端仿真代码时,我重新发现了 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 的控制字符,并且各种历史实现已经共存了一段时间。