Por que CTL-3 / CTL- # é igual a CTL- [? (e outros) no caso de caracteres de controle ASCII

1

Eu tenho redescoberto caracteres de controle ASCII enquanto brinquei com algum código de emulação de terminal, e escrevi um pequeno programa que gera o valor hexadecimal de cada tecla que eu pressiono (tcsetattr () com ~ ICANON).

Embora eu entenda que pressionar as teclas Control e D simultaneamente (CTL-D) gera o caractere de controle% ASCII ^D / EOT / 0x04 e uma série de outras, como muito bem descrito no WP ASCII , fiquei surpreso ao ver que (no OS X pelo menos), algumas outras chaves inesperadas também geravam caracteres de controle:

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

Note que CTL-1, -9 e -0 não geram caracteres de controle, apenas o dígito normal.

Com exceção desses dois caracteres esperados (NUL e RS), por que os terminais geram caracteres de controle para esse subconjunto de teclas numéricas?

Editar: para ficar claro, estou ciente e entendo que CTL - [= Esc, e as outras teclas de "circunflexo" / controle padrão (^ \, ^], ^^, ^ _, ^?). Eu estou querendo saber por que o número ou ^ #, ^ $, ^%, ^ &, ^ * e ^ / control keys se sobrepõem a eles.

    
por John de Largentaye 06.01.2016 / 01:48

1 resposta

0

A notação de intercalação , como ^ D, na verdade não significa Ctrl-D. Significa "O caractere de controle ASCII com o número correspondente à classificação alfabética da letra", nesse caso, D = 4, então ^ D = 0x04. Algumas pessoas decidiram que seria interessante mapear essa notação de cursor para as letras do teclado do esquema ctrl-X. Obviamente, ele quebra em 27, ou 0x1B, que é onde as pessoas precisavam ser criativas.

Meu entendimento é que nunca houve nenhum padrão para mapear caracteres de controle superiores a 0x1A e que várias implementações históricas coexistiram por um tempo.

    
por 06.01.2016 / 03:18