Почему специальные символы, такие как «возврат каретки», представлены как «^ M»?


93

Почему ^Mиспользуется для обозначения возврата каретки в VIM и других контекстах?

Я предполагаю, что Mэто 13-я буква латинского алфавита и возврат каретки \x0Dили десятичный 13. Это причина? Задокументировано ли это представление где-нибудь?

Я заметил, что Tab представлен как ^I, что является девятой буквой латинского алфавита. И наоборот, Tab является \x09или десятичным 9, что поддерживает мою теорию, изложенную выше. Однако где это может быть задокументировано как факт?


1
Также имейте в виду, что для dos / windows используется «0x0d 0x0a», также обозначаемый как «CR LF». Но Unix / Linux используют только «0x0a» или «LF». Поэтому, когда вы открываете документ Windows в Linux, он обнаруживает дополнительный «CR», а когда вы открываете документ Linux в Windows, он не обнаруживает новые строки.
LatinSuD

3
@LatinSuD каркасная нотация (и соответствующее использование клавиши Ctrl) напрямую относится к набору элементов управления C0 (исторически является частью ASCII), а не к тому, использует ли данная операционная система или программа часть этого набора для представления новых строк, или что-то еще остальное. Точно так же, независимо от того, ^Hидет ли удаление символа или допускается наложение текста (например n^H~, устаревший способ создания символа ñ) или любое другое фактическое использование управляющего символа, является отдельным от обозначения каретки.
Джон Ханна

11
старый ... я не могу вспомнить оригинальный код, но ctrl-G звонит в колокольчик!
Брайан Драммонд

3
@OlivierDulac нет, ^ M - это в точности возврат каретки, точно так же, как ^ J - в точности перевод строки. В то время как разные ОС имели разные взгляды на то, должен ли перевод строки и / или возврат каретки или что-то еще (например, символ Newline, используемый некоторыми символами IBM, но не являющийся частью ASCII и, следовательно, не являющийся частью исторического наследия некоторых других ОС), должен ли представляют новую строку в текстовом файле, и хотя некоторые программы затем переопределяют это по-разному, сам U + 000D по-прежнему является возвратом каретки, независимо от того, какие более поздние операционные системы, такие как Unix или DOS, решили сделать с этим. (Конечно, называя это ...
Джон Ханна

1
@OlivierDulac ... U + 000D является проглептическим, так как это имя появилось в Юникоде в 1990-х годах, но оно вполне определенно ссылается на код, существовавший в ASCII в 1963 году, и благодаря этому, как он существовал в модифицированном коде Мюррея Бодо в 1901 году. Мюррей решал проблемы, связанные с перемещением бумаги, с помощью тех же инструментов, которые использовались в понятии «текстовый файл» много десятилетий спустя. Вбейте винт в нечто, похожее на гвоздь, а он все еще винт. Используйте LF и / или CR для представления конца строки в текстовом файле, и они по-прежнему являются переводами строк и возврата каретки.
Джон Ханна

Ответы:


115

Я считаю, что то, о чем на самом деле спрашивал ОП, называется каретной нотацией .

Нотация каретки - это нотация непечатных управляющих символов в кодировке ASCII. Обозначение состоит из каретки (^), за которой следует заглавная буква; этот орграф обозначает код ASCII, который имеет числовое значение, эквивалентное числовому значению буквы. Например, символ EOT со значением 4 представляется как ^ D, потому что D является 4-й буквой в алфавите. Символ NUL со значением 0 представлен как ^ @ (@ - это символ ASCII перед A). Символ DEL со значением 127 обычно представляется как ^ ?, потому что ASCII '?' перед '@' и -1 такой же, как 127, если маскируется до 7 бит. Альтернативная формулировка перевода заключается в том, что печатный символ находится путем обращения 7-го бита кода ASCII.

Полный список управляющих символов ASCII вместе с обозначением каретки можно найти здесь

Относительно vim и других текстовых редакторов: вы обычно увидите ^ M, только если откроете текстовый файл в формате Windows (CRLF) в редакторе, который ожидает окончания строки в Linux (LF). 0x0A отображается как разрыв строки, 0x0D перед тем, как печатается как ^ M. В большинстве случаев настройки редактора по умолчанию включают «автоматическое распознавание концов строк».


1
Мне всегда было интересно, как эта штука называется ...
smci

5
Это соглашение восходит по крайней мере к 1970-м годам; Я впервые увидел его в операционной системе TOPS-10, но, возможно, он уже существовал раньше. Что бы это ни стоило, на старых терминалах ASCII символ, теперь показанный в виде каретки, на самом деле был стрелкой, направленной вверх, поэтому он возник как «нотация вверх».
Кешлам

15
Это явно встроено в дизайн ASCII, так что клавиша Ctrl просто переключает бит 7.
OrangeDog

2
Он не используется только с буквами. Я бы не определял его как управляющий символ с «числовым значением буквы», а скорее как «xor 64». Другими словами, ^Aесть 0x41 xor 0x40, или 0x01и ^?есть 0x3F xor 0x40, или 0x7F.
R ..

1
Ascii DEL (^?) Не имеет ничего общего с ключом удаления. На самом деле это стандартный код, сгенерированный <---ключом (также, как ни странно, называемый backspace) на терминалах, подобных VT100.
R ..

22

Именно в этом причина.

ASCII определяет символы 0-31 как непечатные управляющие коды. Вот выдержка из ascii(7)страницы руководства из случайной системы Linux ( man ascii), вплоть до CR (13):

   Oct   Dec   Hex   Char                       
   ─────────────────────────────────────────────
   000   0     00    NUL '\0'                    
   001   1     01    SOH (start of heading)     
   002   2     02    STX (start of text)         
   003   3     03    ETX (end of text)           
   004   4     04    EOT (end of transmission)   
   005   5     05    ENQ (enquiry)               
   006   6     06    ACK (acknowledge)           
   007   7     07    BEL '\a' (bell)             
   010   8     08    BS  '\b' (backspace)       
   011   9     09    HT  '\t' (horizontal tab)  
   012   10    0A    LF  '\n' (new line)        
   013   11    0B    VT  '\v' (vertical tab)    
   014   12    0C    FF  '\f' (form feed)       
   015   13    0D    CR  '\r' (carriage ret)    

Обычно эти символы генерируются с помощью Controlи буквы, относящейся к требуемому символу. По Gэтой причине на телетайпах и ранних терминальных клавиатурах над значком была написана надпись «BELL» .

Стандартным документом, который определил ASCII, является ASA X3.4-1963 , который был опубликован Американской ассоциацией стандартов в 1963 году. Я не могу найти оригинальный документ на их веб-сайте, но в этом отрывке из исходного документа показана таблица символов, включая контрольные коды выше.


4
Спасибо. Несмотря на информативность, этот ответ не содержит ответа на вопрос.
dotancohen

1
Ответ скрыт во втором абзаце: ^Mэто сокращение от Control-M. На терминале вы должны нажать клавишу Control вместе с клавишей M, чтобы отправить код ASCII 0x0D, также известный как возврат каретки.
Мартин Ливерсэйдж

14

Запись восходит к самым ранним ASCII телетайпам (около 1963 г.). Была клавиша CTRL, которая переключала бит 0x40 так, что CTRL-M (возврат каретки) будет 0D вместо 4D, CTRL-G (звонок) будет 07 вместо 47, CTRL-L (подача формы) будет 0C вместо 4C.

Не было никакого «замысла» в назначении определенных букв определенным функциям, это был просто шанс, что, когда пыль установилась от назначения кодов ASCII, клавиша M была на один бит отличной от возврата каретки, и поэтому возврат каретки стал CTRL-M.

Вот лучший снимок клавиатуры ASR33, который я могу найти. Как видите, имена управляющих символов печатаются маленькими буквами на соответствующих буквенных клавишах.

Телетайп Модель 33 ASR с перфоратором / считывателем бумажной ленты

Изображение Marcin Wichary, пользователь: AlanM1 (получено (обрезано) из файла: ASR-33 2.jpg ) [ CC BY 2.0 ], через Wikimedia Commons

Ключ M не имеет обозначения, потому что есть выделенный ключ «RETURN», поэтому CTRL-M является избыточным.


2
В какой-то степени степень, в которой мы все еще связаны выбором дизайна, сделанным для того, что сейчас кажется древним системам, довольно удивительна - я думаю, подумав, что (а) это не так давно, просто темпы изменений во времени Это было удивительно, и (b) если будет принято достаточно проектных решений, некоторые из них (особенно те, которые не вызывают у людей достаточного количества проблем) неизбежно останутся без внимания после того, как причины исчезнут в памяти. Все же странное чувство оглядываться на историю некоторых из этих вещей, хотя.
Стюарт Голодец

2
@StuartGolodetz - На самом деле, я нахожу это странно обнадеживающим. Но потом я помню, когда Teletypes были «передовой технологией». (Между прочим, Teletype ASR-33 отличался элегантной простотой. Жаль только, что «современные» компьютерные системы были так же хорошо спроектированы.)
Даниэль Р Хикс,

1
Это удивительно, но я не понимаю, почему они решили, что этой машинке нужен звонок?
CaptainCodeman

4
@CaptainCodeman - Когда вы передали важное сообщение, вам нужно было позвонить, чтобы привлечь внимание оператора на другом конце.
Даниэль Р Хикс

2
Интересно отметить, что клавиша Ctrl сохранилась до наших дней на клавиатурах ПК.
Даниэль Р Хикс

3

Символ каретки (^) - это просто сокращение для записи, удерживая нажатой клавишу «Control» - CTRL.

В старые добрые времена вы могли вводить эти коды (см. Выше) напрямую, клавиша Ctrl + G (^ G) заставляла терминал «дин»

Если вы хотите добавить CR в Vim, вы используете клавиши Ctrl + M и т. Д. = Ctrl + I


Вы ищете термин « орграф» , что означает два символа, которые представляют один символ. В частности, орграфы и триграфы используются для представления непечатаемых символов. Исторически они также использовались для символов, которые не появляются на клавиатуре, хотя с современными графическими интерфейсами и клавиатурами это не проблема, поэтому такое использование более архаично.

«В старые добрые времена» все еще сегодня, и ^ C и ^ D совершенно функциональны. Единственная причина, по которой ^ G больше не заставляет терминал звонить, состоит в том, что в большинстве эмуляторов терминала этот отклик отключен.
SevenSidedDie

2

Потребность в некотором визуальном способе отображения того, что по определению является непечатными символами.

Итак, кто-то в начале 1970-х (или, может быть, раньше) (я помню, что видел это на CP / M, а кто-то еще уже упомянул TOPS) решил, что «символ каретки плюс» будет символом для 26 непечатаемых управляющих символов ASCII со значениями С 1 по 26. Значение 0 печатается как ^ @, а значение 127 - как ^ ?.


1

Где это задокументировано, на этой странице перечислены все управляющие символы с указанием того, как вводить / представлять их с помощью управляющего ключа (хотя первый, ascii-символ 0, не имеет представления управляющего ключа), и для него нет ничего для символа 127. И это предоставляет источники внизу

https://www.cs.tut.fi/~jkorpela/chars/c0.html

Можно задаться вопросом, учитывая, что есть 33 управляющих символа (символы ASCII 0-31, 32 символа, + символ 127. итак, 33 символа). Как все они будут представлены, поскольку в алфавите всего 26 букв. Ну, он использует Ctrl-A для символа Ascii 1, Ctrl-Z для символа ascii 26, и там, как только он достигает Ctrl-Z, он использует [ \ ] ^ _

Он отображает Ctrl-Z как SUB, хотя в DOS и в командной строке cmd это EOF, и вы, как технический специалист, используете его, когда делаете, copy con a.aгде a.aнаходится ваш файл. Вы вводите текст и завершаете его нажатием Ctrl-Z, который, как ни странно, не вводит маркер EOF. Но говорит CMD, что это конец файла, поэтому CMD записывает его.

Эта веб-страница cs.tut.fi предоставляет этот источник
http://www.wps.com/texts/codes/X3.4-1963/index.html.

но это неработающая ссылка, но доступная на archive.org в виде JPG

Американский стандартный код для обмена информацией
ASA стандарт X3.4-1963

https://web.archive.org/web/20010430085116/http://www.wps.com/texts/codes/X3.4-1963/index.html


Большинство управляющих символов не имеют смысла, но даже некоторые из них со значением, например, Ctrl-I, я не уверен, где вы можете просто нажать Ctrl-I и получить вкладку.
Барлоп

1
ни один из управляющих символов не имеет смысла. Многие из них не используются во многих контекстах, но каждый из них имеет хотя бы одно значение.
Джон Ханна

@JonHanna Конечно, я не имею в виду, что они были бессмысленными (прошедшее время). Но Р. у них не было смысла в течение десятилетий, то есть у них было свое первоначальное значение, которое было много веков назад, технологии, которые больше не работают, (большинство символов) сегодня бессмысленны С текущими и даже немного старыми технологиями. Если их используют в современных целях, это не так много. Здесь есть список en.wikipedia.org/wiki/Control_character из них общего пользования 0,7,8,9,10,11,12,13,127. 9/33, так что остальные (24 из них) могли бы либо очень редко, либо вообще не делать этого, поскольку они настолько же мертвы, как и неиспользованный в течение десятилетий механизм, на котором они использовались
barlop

Associated Press по-прежнему использует ANPA-1312, который использует 1–4, 6 и 16 используются для запуска каждого соединения TCP / IP. Современные принтеры (среди прочих) по-прежнему используют 17 и 19. Вместе с теми, о которых вы упомянули, мы покрыли довольно большой процент без особых усилий. Я признаю, что они не используются интенсивно , но они тоже не мертвы.
Джон Ханна

1
@barlop Вы можете сделать ^Iдля вкладки в стандартном bash: type, ls ~/^I^Iи вы должны увидеть все папки в вашем домашнем каталоге.
wchargin

0

Вы можете увидеть все , не pritable ASCII символов Controlотображения в этой таблице.


5
Хотя это может теоретически ответить на вопрос, было бы предпочтительным включить здесь основные части ответа и предоставить ссылку для справки. Таким образом, если связанная страница когда-либо изменится или станет недействительной по какой-либо причине, ответ все равно будет полезен посетителям Суперпользователя.
CVn

3
Спасибо. Несмотря на информативность, этот ответ не содержит ответа на вопрос.
dotancohen
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.