Почему CTL-3 / CTL- # равно CTL- [? (и другие) в случае управляющих символов ASCII

333
John de Largentaye

Я заново открыл управляющие символы 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
^ - [= Esc широко поддерживается и является наиболее совместимым способом отправки клавиши Esc в vim (даже через несколько терминалов, использующих удаленные сеансы и т. Д.). Ctrl-] настолько широко признан, что хотя Telnet.exe Win95 не поддерживает 0x1D, он поддерживает Ctrl-]. ^ -? это совсем не удивительно, возможно, из-за некоторых старых экспериментов, которые я провел. Моя главная мысль заключается в том, что я точно знаю, по знакомству, что, по крайней мере, некоторые из них совсем не похожи на OSX. TOOGAM 8 лет назад 0
Я хорошо знаю ^ [= ESC и другие стандартные контрольные символы, но это не тот вопрос, о котором идет речь. John de Largentaye 8 лет назад 0

1 ответ на вопрос

0
YvesQuemener

Обозначение каретки, как ^ D, на самом деле не означает Ctrl-D. В этом случае это означает «управляющий символ ASCII с номером, совпадающим с алфавитным рангом буквы», D = 4, поэтому ^ D = 0x04. Некоторые люди решили, что было бы неплохо сопоставить эти обозначения карет с буквами клавиатуры схемы ctrl-X. Очевидно, что он ломается в 27, или 0x1B, где люди должны были быть творческими.

Насколько я понимаю, никогда не было никакого стандарта для отображения управляющего символа, превосходящего 0x1A, и что различные исторические реализации сосуществовали некоторое время.

Не в этом дело на самом деле, но получил цитату для «^ D! = CTL-D первоначально»? :) Википедии нет. John de Largentaye 8 лет назад 0
На самом деле, согласно http://superuser.com/a/764656/541440, и копаться в истории Teletypes https://en.wikipedia.org/wiki/Teleprinter#Control_characters, кажется, что с самого начала это было предназначен для генерации этих управляющих символов с помощью клавиши Ctrl + John de Largentaye 8 лет назад 0