Чому спеціальні символи, такі як "повернення каретки", представлені як "^ 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 є пролептичним, оскільки ця назва з'явилася разом з Unicode в 1990-х, але це цілком виразно посилається на код, як він існував в ASCII в 1963 році, а також через той, який існував у модифікованому коду Бодо в 1901 році Мюррея Мюррей вирішував проблеми, пов'язані з переміщенням паперу, тими ж інструментами, які використовувались у концепції "текстового файлу" через багато десятиліть. Забийте гвинт у щось на зразок цвяха, і це все одно гвинт. Використовуйте LF та / або CR, щоб представити кінець рядка в текстовому файлі, і вони все ще канали рядків та повернення каретки.
Джон Ханна

Відповіді:


115

Я вважаю, що те, про що насправді запитували ОП, називається « Карета» .

Позначення карет - це позначення для недрукованих символів управління в кодуванні ASCII. Позначення складається з карети (^), за якою йде велика літера; цей диграф означає код ASCII, який має числове значення, еквівалентне цифровому значенню букви. Наприклад, символ EOT зі значенням 4 представлений як ^ D, оскільки D - четверта літера в алфавіті. Символ 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 персонаж, який тепер показаний як каретка, насправді був стрілкою, спрямованою вгору, тому це походило як "позначення вгору".
keshlam

15
Це чітко вбудовано в дизайн ASCII, так що клавіша Ctrl просто перемикає біт 7.
OrangeDog

2
Він не використовується тільки з літерами. Я б не визначав це як контрольний символ із "числовим значенням букви", а як "xor 64". Іншими словами, ^Aце 0x41 xor 0x40, або 0x01і ^?є 0x3F xor 0x40, або 0x7F.
R ..

1
Ascii DEL (^?) Не має нічого спільного з ключем видалення. Насправді це стандартний код, що генерується <---ключем (також, що заплутано називається зворотним простором) на терміналах, подібних до 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 замість 4С.

Не було "дизайну" при призначенні певних букв певним функціям, був лише випадковий випадок, коли пил осіла від присвоєння ASCII-кодів, ключ M трохи відрізнявся від повернення каретки і, отже, повернення каретки стало CTRL-M.

Ось найкращий знімок, який я можу знайти з клавіатури ASR33. Як ви бачите, імена контрольних символів друкуються маленькими літерами на відповідних клавішах альфа.

Teletype Model 33 ASR з перфоратором / зчитувачем паперової стрічки

Зображення Marcin Wichary, Користувач: AlanM1 (Отриманий (обрізаний) з Файл: ASR-33 2.jpg ) [ CC BY 2.0 ], через Wikimedia Commons

Клавіша M не має позначень на ній, оскільки є виділений ключ "RETURN", тому CTRL-M є зайвим.


2
На деякому рівні ступінь, на який ми все ще пов'язані з вибором дизайну, зробленим для тих, що зараз здаються давніми системами, є досить дивовижним - я думаю, поміркувавши, що (а) це не так давно, це просто темпи змін у проміжок часу вражає, і (b) якщо буде прийнято достатньо дизайнерських рішень, деякі з них (особливо ті, що не викликають у людей достатньої кількості проблем), повинні залишатися довгі після того, як причини їх зникнуть у пам'яті. І все-таки дивне відчуття оглянути назад історію деяких цих речей.
Стюарт Голодець

2
@StuartGolodetz - Насправді, мені це здається дивним заспокоєнням. Але тоді я пам’ятаю, коли телетайпи були «передовою технологією». (Teletype ASR-33, до речі, був чудовим своєю елегантною простотою. Бажаю лише, щоб "сучасні" комп'ютерні системи були настільки добре розроблені.)
Daniel R Hicks

1
Це захоплююче, але те, що я не розумію, це .. чому з усіх речей вони вирішили, що цій машинці потрібен дзвін?
КапітанКодеман

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

2
Цікаво відзначити, що клавіша Ctrl зберігається донині на клавіатурах ПК.
Даніель Р Хікс

3

Карета (^) - це просто стенограма для написання, утримуючи клавішу Control - CTRL вниз.

У старі добрі часи ви могли вводити ці коди (див. Вище) безпосередньо, клавіша Ctrl + G (^ G) зробить термінал "ding"

Коли ви хочете додати CR у Vim, ви використовуєте клавішу Ctrl + M тощо табуляцію = Ctrl + I


Термін, який ви шукаєте, - це диграф , що означає два символи, які представляють один символ. Зокрема, для представлення символів, що не друкуються, використовуються діаграми та триграфи. Історично вони також використовувались для символів, які не відображаються на клавіатурі, хоча для сучасних графічних інтерфейсів та клавіатур це менше проблеми, тому це використання є більш архаїчним.

"У старі добрі часи" існує і сьогодні, з ^ C і ^ D ідеально функціональними. Єдина причина, що ^ G більше не робить термінал ding, це те, що більшість емуляторів терміналів вимкнено цю відповідь.
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, і як користувач techie ви використовуєте його, коли робите, 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 Звичайно, я не маю на увазі, що вони були безглуздими (минуле напруження). Але Р. не мали сенсу десятиліттями, тобто вони мали свої початкові значення з епох тому, тех, які більше не працюють, сьогодні (більшість знаків) безглузді сьогодні з / поточним і навіть трохи старим tech.n, якщо будь-який застосовується для сучасного використання, це не так багато. Тут є список en.wikipedia.org/wiki/Control_character спільних для користування 0,7,8,9,10,11,12,13,127. 9/33, тому інші (24 з них) у або б дуже рідко, або зовсім не так, як вони мертві, як антик, не використаний поза використання десятиліттями техніки, на якій вони використовувались
барлоп

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

1
@barlop Ви можете зробити ^Iдля вкладки в стандартному файлі bash: введіть ls ~/^I^Iі ви повинні побачити всі папки у своєму домашньому каталозі.
wchargin

0

Ви можете побачити всі , НЕ pritable ASCII символів Controlвідображення в цій таблиці.


5
Хоча це теоретично може відповісти на питання, бажано було б сюди включити істотні частини відповіді та надати посилання для довідки. Таким чином, якщо пов’язана сторінка коли-небудь зміниться або стане недійсною з будь-якої причини, відповідь все одно буде корисна відвідувачам Super User.
CVn

3
Дякую. Ця відповідь, хоч і інформативна, не містить відповіді на запитання.
dotancohen
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.