Dlaczego znaki specjalne, takie jak „powrót karetki”, przedstawiane są jako „^ M”?

93

Dlaczego jest ^Mużywany do reprezentowania powrotu karetki w VIM i innych kontekstach?

Domyślam się, że Mjest to trzynasta litera alfabetu łacińskiego, a znak powrotu karetki jest \x0Ddziesiętny 13. Czy to jest powód? Czy to przedstawienie jest gdziekolwiek udokumentowane?

Zauważam, że Tab jest reprezentowany przez ^I, która jest dziewiątą literą alfabetu łacińskiego. I odwrotnie, tab jest \x09dziesiętny 9, co potwierdza moją teorię podaną powyżej. Gdzie jednak można to udokumentować jako fakt?

dotancohen
źródło
1
Należy również pamiętać, że dos / windows używają „0x0d 0x0a”, zwanego również „CR LF”. Ale Unix / Linux używają tylko „0x0a” lub „LF”. Kiedy więc otwierasz dokument systemu Windows w systemie Linux, wykrywa on dodatkowy „CR”, a kiedy otwierasz dokument systemu Linux w systemie Windows, nie wykrywa nowych linii.
LatinSuD
3
Notacja karetki @LatinSuD (i odpowiednie użycie klawisza Ctrl) odnosi się bezpośrednio do zestawu kontrolnego C0 (historycznie część ASCII), a nie to, czy i jak dany system operacyjny lub program wykorzystuje część tego zestawu do reprezentowania nowych linii lub czegokolwiek jeszcze. Podobnie, to, czy ^Husuwa znak lub pozwala na nadruk (na przykład jako n^H~przestarzały sposób produkcji ñ) lub jakiekolwiek inne rzeczywiste użycie znaku kontrolnego jest odrębne od notacji daszka.
Jon Hanna
11
stary ... Nie pamiętam oryginalnego kodu, ale ctrl-G dzwoni dzwonkiem!
Brian Drummond
3
@OlivierDulac nie, ^ M jest dokładnie znakiem powrotu karetki, tak jak ^ J jest dokładnie przesunięciem wiersza. Podczas gdy różne systemy operacyjne mają różne poglądy na to, czy przesunięcie wiersza i / lub powrót karetki lub coś innego (jak znak Newline używany przez niektóre znaki IBM, ale nie jest częścią ASCII, a więc nie jest częścią historycznego dziedzictwa niektórych innych systemów operacyjnych) powinien reprezentują nową linię w pliku tekstowym i chociaż niektóre programy nadpisały, że na różne sposoby, sam U + 000D wciąż jest znakiem powrotu karetki, niezależnie od tego, jakie później systemy operacyjne takie jak Unix lub DOS zdecydują się z tym zrobić. (Oczywiście, nazywając to ...
Jon Hanna
1
@OlivierDulac ... U + 000D jest proleptyczny, ponieważ nazwa ta pojawiła się w Unicode w latach 90., ale to zdecydowanie odnosi się do kodu istniejącego w ASCII w 1963 r., A także, ponieważ istniał w zmodyfikowanym kodzie Baudota Murraya w 1901 r. Murray rozwiązał problemy związane z przenoszeniem papieru za pomocą tych samych narzędzi, które zastosowano w koncepcji „pliku tekstowego” wiele dziesięcioleci później. Wbij śrubę w coś w rodzaju gwoździa, a nadal będzie to śruba. Użyj LF i / lub CR do reprezentowania końca linii w pliku tekstowym, a nadal będą to linie i zwroty karetki.
Jon Hanna

Odpowiedzi:

115

Uważam, że to, o co OP tak naprawdę pytał, nazywa się Caret Notation .

Notacja daszkowa to notacja dla niedrukowalnych znaków kontrolnych w kodowaniu ASCII. Notacja składa się z karetki (^), po której następuje wielka litera; ten znak oznacza kod ASCII, który ma wartość liczbową równoważną wartości liczbowej litery. Na przykład znak EOT o wartości 4 jest reprezentowany jako ^ D, ponieważ D jest czwartą literą alfabetu. Znak NUL o wartości 0 jest reprezentowany jako ^ @ (@ to znak ASCII przed A). Znak DEL o wartości 127 jest zwykle reprezentowany jako ^ ?, ponieważ ASCII „?” jest przed „@”, a -1 jest takie samo jak 127, jeśli jest zamaskowane na 7 bitów. Alternatywnym sformułowaniem tłumaczenia jest to, że drukowany znak znajduje się poprzez odwrócenie siódmego bitu kodu ASCII

Pełna lista znaków kontrolnych ASCII wraz z notacją daszka można znaleźć tutaj

Odnośnie vima i innych edytorów tekstu: Zazwyczaj zobaczysz ^ M tylko wtedy, gdy otworzysz plik tekstowy w formacie Windows (CRLF) w edytorze, który oczekuje zakończenia linii Linux (LF). 0x0A jest renderowane jako podział linii, 0x0D tuż przed wydrukowaniem jako ^ M. W większości przypadków domyślne ustawienia edytora obejmują „automatyczne rozpoznawanie zakończeń linii”.

Art Gertner
źródło
1
Zawsze zastanawiałem się, jak to się nazywa ...
smci
5
Konwencja ta sięga przynajmniej lat siedemdziesiątych; Po raz pierwszy zobaczyłem go w systemie operacyjnym TOPS-10, ale mógł istnieć wcześniej. O ile jest to warte, na starszych terminalach ASCII postać pokazana teraz jako karetka była w rzeczywistości strzałką skierowaną w górę, więc powstała ona jako „notacja w górę”.
keshlam
15
Jest to wyraźnie wbudowane w projekt ASCII, tak więc klawisz Ctrl przełącza tylko bit 7.
OrangeDog
2
Nie jest używany tylko z literami. Nie zdefiniowałbym go jako znaku kontrolnego z „wartością liczbową litery”, ale raczej jako „xor 64”. Innymi słowy, ^Ajest 0x41 xor 0x40, 0x01i ^?jest 0x3F xor 0x40, lub 0x7F.
R ..
1
Ascii DEL (^?) Nie ma nic wspólnego z kluczem usuwania. W rzeczywistości jest to standardowy kod generowany przez <---klucz (również myląco nazywany backspace) na terminalach podobnych do VT100.
R ..
22

To jest dokładnie powód.

ASCII definiuje znaki 0–31 jako niedrukowalne kody sterujące. Oto fragment strony ascii(7)podręcznika z losowego systemu Linux ( man ascii), aż do 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)    

Zazwyczaj te znaki są generowane za Controlpomocą litery wymaganej. Z Gtego powodu w teletypach i wczesnych klawiaturach terminali napisano „BELL” .

Dokumentem standardowym, który zdefiniował ASCII jest ASA X3.4-1963 , który został opublikowany przez American Standards Association w 1963 roku. Nie mogę znaleźć oryginalnego dokumentu na ich stronie internetowej, ale ten fragment oryginalnego dokumentu pokazuje tabelę znaków, w tym powyższe kody kontrolne.

Flup
źródło
4
Dziękuję Ci. Ta informacja, choć pouczająca, nie zawiera odpowiedzi na pytanie.
dotancohen
1
Odpowiedź jest ukryta w drugim akapicie: ^Mjest skrótem dla Control-M. Na terminalu należy nacisnąć klawisz Control razem z klawiszem M, aby wysłać kod ASCII 0x0D znany również jako powrót karetki.
Martin Liversage,
14

Notacja sięga najwcześniejszych Teletypów ASCII (ok. 1963 r.). Był klawisz CTRL, który przełączał bit 0x40, tak że CTRL-M (powrót karetki) wynosiłby 0D zamiast 4D, CTRL-G (dzwonek) miałby wartość 07 zamiast 47, CTRL-L (wysuw formularza) zamiast 0C 4C.

Nie było „projektu” w przypisywaniu poszczególnych liter do poszczególnych funkcji, była tylko szansa, że ​​kiedy kurz opadł z przypisywania kodów ASCII, klawisz M był nieco inny niż powrót karetki, a zatem powrót karetki stał się CTRL-M.

Oto najlepsze zdjęcie, jakie mogę znaleźć na klawiaturze ASR33. Jak widać, nazwy znaków kontrolnych są drukowane małymi literami na odpowiednich klawiszach alfa.

Teletype Model 33 ASR z dziurkaczem / czytnikiem taśmy papierowej

Zdjęcie : Marcin Wichary, Użytkownik: AlanM1 (Pochodzi (przycięty) z pliku: ASR-33 2.jpg ) [ CC BY 2.0 ], za pośrednictwem Wikimedia Commons

Klawisz M nie ma na nim zapisu, ponieważ istnieje dedykowany klawisz „RETURN”, więc CTRL-M jest redundantny.

Daniel R. Hicks
źródło
2
Na pewnym poziomie stopień, w jakim nadal jesteśmy związani wyborami projektowymi, które wydają się być teraz starożytnymi systemami, jest dość zaskakujący - po refleksji wydaje mi się, że (a) nie było tak dawno temu, po prostu tempo zmian w międzyczasie było zadziwiające i (b) jeśli podjęto wystarczającą liczbę decyzji projektowych, niektóre z nich (zwłaszcza te, które nie powodują wystarczającej liczby problemów), będą musiały pozostać długo po tym, jak przyczyny ich znikną w pamięci. Wciąż dziwne uczucie, gdy patrzy się wstecz na historię niektórych z tych rzeczy.
Stuart Golodetz
2
@StuartGolodetz - Właściwie to dziwnie mnie uspokaja. Ale potem pamiętam, kiedy Teletypy były „zaawansowaną technologią”. (Nawiasem mówiąc, Teletype ASR-33 był niezwykły ze względu na swoją elegancką prostotę. Żałuję tylko, że „nowoczesne” systemy komputerowe nie były tak dobrze zaprojektowane.)
Daniel R Hicks
1
To fascynujące, ale nie rozumiem… dlaczego wszyscy zdecydowali, że ta maszyna do pisania potrzebuje dzwonka?
CaptainCodeman
4
@CaptainCodeman - Gdy przesłałeś ważną wiadomość, zadzwonisz, aby zwrócić uwagę operatora na drugim końcu.
Daniel R Hicks
2
Warto zauważyć, że klawisz Ctrl przetrwał do dziś na klawiaturach komputerowych.
Daniel R Hicks
3

Kreska (^) jest po prostu skrótem do pisania, przytrzymaj klawisz Control - CTRL w dół.

W dawnych dobrych czasach można było wpisywać te kody (patrz wyżej), klawisz Ctrl + G (^ G) powodował, że terminal zaczynał „ding”

Kiedy chcesz dodać CR w Vimie, użyj Ctrl + M etc tab = Ctrl + I

Don
źródło
Poszukiwany termin to digraf , co oznacza dwa znaki reprezentujące jeden znak. W szczególności znaki graficzne i trójwymiarowe są używane do przedstawienia znaków niedrukowalnych. Historycznie były one również używane w przypadku znaków, które nie pojawiają się na klawiaturze, chociaż w nowoczesnych GUI i klawiaturach jest to mniejszy problem, więc to użycie jest bardziej archaiczne.
„W dawnych dobrych czasach” jest nadal obecny, a ^ C i ^ D są doskonale funkcjonalne. Jedynym powodem, dla którego ^ G nie powoduje, że terminal przestanie działać, jest to, że większość emulatorów terminali ma tę odpowiedź wyłączoną.
SevenSidedDie
2

Potrzeba wizualnego sposobu wyświetlania znaków, które z definicji nie są drukowalne.

Tak więc ktoś na początku lat 70. (a może wcześniej) (pamiętam, że widziałem to na CP / M, a ktoś już wspomniał o TOPS) zdecydował, że „daszek plus litera” będzie symbolem 26 niedrukowalnych znaków kontrolnych ASCII o wartościach 1 do 26. Wartość 0 jest / została wydrukowana jako ^ @, a wartość 127 jako ^ ?.

RonJohn
źródło
1

Gdzie jest to udokumentowane, ta strona zawiera listę każdego znaku kontrolnego, wraz z tym, jak wprowadzić / przedstawić go za pomocą klawisza sterującego (chociaż pierwszy, znak ascii 0, nie ma reprezentacji klawisza sterującego) i nie ma nic dla znaku 127. I zapewnia źródła na dole

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

Można się dziwić, biorąc pod uwagę, że istnieją 33 znaki kontrolne (znaki ASCII 0–31, a więc 32 znaki, + znak 127. tak, = 33 znaki) Jak wszystkie byłyby reprezentowane, ponieważ w alfabecie jest tylko 26 liter. Używa Ctrl-A dla znaku Ascii 1, Ctrl-Z dla znaku Ascii 26, a tam, gdy osiągnie Ctrl-Z, używa [ \ ] ^ _

Wyświetla Ctrl-Z jako SUB, chociaż w DOS-ie i wierszu polecenia cmd jest to EOF, a jako użytkownik technologii używasz go, gdy robisz, copy con a.agdzie a.ajest twój plik. Wpisujesz tekst i kończysz go klawiszem Ctrl-Z, co w zabawny sposób nie wprowadza znacznika EOF. Ale mówi CMD, że to koniec pliku, więc CMD je zapisuje.

Ta strona cs.tut.fi daje to jako źródło
http://www.wps.com/texts/codes/X3.4-1963/index.html

ale jest to uszkodzony link, ale dostępny na archive.org ma postać JPG

Amerykański standardowy kod wymiany informacji
Standard ASA X3.4-1963

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

barlop
źródło
Większość znaków kontrolnych jest bez znaczenia, ale nawet niektóre z nich, takie jak Ctrl-I, nie jestem pewien, gdzie możesz po prostu zrobić Ctrl-I i uzyskać zakładkę.
barlop
1
żaden z znaków kontrolnych nie ma znaczenia. Wiele z nich nie jest używanych w wielu kontekstach, ale każdy z nich ma co najmniej jedno znaczenie.
Jon Hanna
@JonHanna Oczywiście nie mam na myśli, że były bez znaczenia (czas przeszły). Ale R. były bez znaczenia przez dziesięciolecia, tj. Miały swoje oryginalne znaczenia sprzed eonów temu, technologia, która już nie działa, jest (większość znaków) dziś bez znaczenia w / current, a nawet nieco stara technologia. jeśli jakieś są wykorzystywane do nowoczesnych zastosowań, nie ma ich wiele. Jest tutaj lista en.wikipedia.org/wiki/Control_character tych powszechnie używanych 0,7,8,9,10,11,12,13,127. 9/33, więc pozostali (24 z nich) albo c bardzo rzadko, albo wcale nie będą, ponieważ są tak martwi, jak wybryki nieużywane przez dziesięciolecia maszyny, na których były używane
barlop,
Associated Press nadal korzysta z ANPA-1312, który używa 1–4, 6 i 16 jest używanych do uruchamiania każdego połączenia TCP / IP. Nowoczesne drukarki (między innymi) nadal używają 17 i 19. Razem z tymi, o których wspomniałeś, mamy ich całkiem pokaźną część, nie próbując naprawdę. Przyznaję, że nie są intensywnie używane, ale też nie są martwe.
Jon Hanna
1
@barlop Możesz zrobić ^Izakładkę w standardowym bash: wpisz ls ~/^I^Ii powinieneś zobaczyć wszystkie foldery w swoim katalogu domowym.
wchargin
0

W tej tabeli możesz zobaczyć wszystkie niepriorytetowe Controlmapowanie znaków ASCII .

Ofir Luzon
źródło
5
Chociaż teoretycznie może to odpowiedzieć na pytanie, lepiej byłoby zawrzeć tutaj istotne części odpowiedzi i podać odnośnik. W ten sposób, jeśli połączona strona kiedykolwiek ulegnie zmianie lub stanie się nieważna z jakiegokolwiek powodu, odpowiedź będzie nadal przydatna dla odwiedzających SuperUżytkownika.
CVn
3
Dziękuję Ci. Ta informacja, choć pouczająca, nie zawiera odpowiedzi na pytanie.
dotancohen