Perché i caratteri speciali come "ritorno a capo" sono rappresentati come "^ M"?


93

Perché viene ^Mutilizzato per rappresentare un ritorno a capo in VIM e in altri contesti?

La mia ipotesi è che Msia la tredicesima lettera dell'alfabeto latino e un ritorno a capo è \x0Do decimale 13. È questa la ragione? Questa rappresentazione è documentata ovunque?

Vedo che Tab è rappresentato da ^I, che è la nona lettera dell'alfabeto latino. Al contrario, Tab è \x09o decimale 9, che supporta la mia teoria sopra indicata. Tuttavia, dove potrebbe essere documentato come un fatto?


1
Inoltre, tieni presente che dos / windows usano "0x0d 0x0a", indicato anche come "CR LF". Ma unix / linux usano solo "0x0a" o "LF". Quindi quando apri un documento Windows in Linux, rileva un "CR" in più, e quando apri un documento Linux in Windows non rileva nuove righe.
LatinSuD

3
La notazione caret di @LatinSuD (e l'uso corrispondente del tasto Ctrl) si riferisce direttamente al set di controllo C0 (storicamente parte di ASCII) e non se e come un determinato sistema operativo o programma utilizza parte di quel set nel rappresentare nuove linee o altro altro. Allo stesso modo, se si ^Helimina un personaggio o si consente la sovrastampa ( n^H~come un modo obsoleto per produrre ñ) o qualsiasi altro uso effettivo del carattere di controllo è separato dalla notazione di inserimento.
Jon Hanna,

11
vecchio ... Non ricordo il codice originale, ma ctrl-G suona un campanello!
Brian Drummond,

3
@OlivierDulac no, ^ M è esattamente un ritorno a capo , proprio come ^ J è esattamente un avanzamento riga. Mentre diversi sistemi operativi hanno avuto opinioni diverse sul fatto che l'alimentazione di riga e / o il ritorno a capo o qualcos'altro (come il carattere Newline utilizzato da alcuni caratteri IBM ma non parte di ASCII e quindi non parte dell'eredità storica di alcuni altri sistemi operativi) dovrebbe rappresenta una nuova riga in un file di testo, e mentre alcuni programmi hanno poi ignorato che in modi diversi, U + 000D stesso è ancora un ritorno a capo, qualunque sistema operativo successivo come Unix o DOS abbia deciso di fare con esso. (Certo, chiamandolo ...
Jon Hanna il

1
@OlivierDulac ... U + 000D è prolettico, dal momento che quel nome venne con Unicode negli anni '90, ma che fa sicuramente riferimento al codice come esisteva in ASCII nel 1963, e attraverso quello che esisteva nel codice Baudot modificato di Murray nel 1901 Murray stava risolvendo problemi legati allo spostamento della carta, con gli stessi strumenti usati nel concetto di "file di testo" molti decenni dopo. Martella una vite in qualcosa come un chiodo, ed è ancora una vite. Usa LF e / o CR per rappresentare la fine di una riga in un file di testo e sono comunque avanzamenti di riga e ritorni a capo.
Jon Hanna,

Risposte:


115

Credo che ciò che OP stesse chiedendo in realtà si chiama Caret Notation .

La notazione caret è una notazione per caratteri di controllo non stampabili nella codifica ASCII. La notazione è composta da un cursore (^) seguito da una lettera maiuscola; questo digrafo sta per il codice ASCII che ha il valore numerico equivalente al valore numerico della lettera. Ad esempio, il carattere EOT con un valore di 4 è rappresentato come ^ D perché D è la quarta lettera dell'alfabeto. Il carattere NUL con un valore di 0 è rappresentato come ^ @ (@ è il carattere ASCII prima di A). Il carattere DEL con il valore 127 è solitamente rappresentato come ^ ?, perché ASCII '?' è prima di "@" e -1 è uguale a 127 se mascherato a 7 bit. Una formulazione alternativa della traduzione è che il carattere stampato viene trovato invertendo il 7 ° bit del codice ASCII

L'elenco completo dei caratteri di controllo ASCII insieme alla notazione caret è disponibile qui

Per quanto riguarda vim e altri editor di testo: in genere vedrai ^ M solo se apri un file di testo in formato Windows (CRLF) in un editor che prevede la fine delle righe di Linux (LF). Lo 0x0A viene visualizzato come un'interruzione di riga, lo 0x0D prima che venga stampato come ^ M. La maggior parte delle volte, le impostazioni predefinite dell'editor includono "Riconosci automaticamente le terminazioni di riga".


1
Mi sono sempre chiesto come si chiamava quella cosa ...
smci,

5
Questa convenzione risale almeno agli anni '70; L'ho visto per la prima volta sul sistema operativo TOPS-10, ma potrebbe benissimo esistere prima. Per quello che vale, sui vecchi terminali ASCII il personaggio ora mostrato come un cursore era in realtà una freccia che punta verso l'alto, quindi questo ha avuto origine come "notazione uparrow".
Keshlam,

15
Questo è esplicitamente integrato nel design ASCII in modo che il tasto Ctrl
commuti il

2
Non è usato solo con le lettere. Non lo definirei come il carattere di controllo con "il valore numerico della lettera" ma piuttosto come "xo 64". In altre parole, ^Aè 0x41 xor 0x40, o 0x01ed ^?è 0x3F xor 0x40, o 0x7F.
R ..

1
Ascii DEL (^?) Non ha nulla a che fare con il tasto Canc. In realtà è il codice standard generato dalla <---chiave (anche, confusamente, chiamato backspace) su terminali simili a VT100.
R ..

22

Questo è esattamente il motivo.

ASCII definisce i caratteri 0-31 come codici di controllo non stampabili. Ecco un estratto dalla ascii(7)pagina del manuale da un sistema Linux casuale ( man ascii), fino a CR (13) incluso:

   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)    

Convenzionalmente questi caratteri vengono generati con Controle la lettera relativa al carattere richiesto. GPer questo motivo i teletipi e le prime tastiere terminali avevano scritto "BELL" sopra il tasto.

Il documento sugli standard che ha definito ASCII è ASA X3.4-1963 , pubblicato dall'American Standards Association nel 1963. Non riesco a trovare il documento originale sul loro sito Web, ma questo estratto del documento originale mostra la tabella dei caratteri, tra cui i codici di controllo sopra.


4
Grazie. Sebbene sia istruttiva, questa risposta non contiene la risposta alla domanda.
dotancohen,

1
La risposta è nascosta nel secondo paragrafo: ^Mè una scorciatoia per Control-M. Sul terminale si preme il tasto Control insieme al tasto M per inviare il codice ASCII 0x0D noto anche come ritorno a capo.
Martin Liversage,

14

La notazione risale ai primi Teletipi ASCII (circa 1963). C'era una chiave CTRL che attivava / disattiva 0x40 bit in modo che CTRL-M (ritorno a capo) sarebbe 0D invece di 4D, CTRL-G (campana) sarebbe 07 invece di 47, CTRL-L (avanzamento modulo) sarebbe 0C invece di 4C.

Non vi era alcun "disegno" nell'assegnare lettere particolari a funzioni particolari, era solo una possibilità che, quando la polvere si assestava dall'assegnazione dei codici ASCII, il tasto M fosse un po 'diverso dal ritorno a capo e quindi il ritorno a capo divenne CTRL-M.

Ecco lo scatto migliore che posso trovare su una tastiera ASR33. Come puoi vedere, i nomi dei personaggi di controllo sono stampati in lettere minuscole sui corrispondenti tasti alfabetici.

Teletype Modello 33 ASR con perforatore / lettore di nastro di carta

Immagine di Marcin Wichary, Utente: AlanM1 (derivato (ritagliato) dal file: ASR-33 2.jpg ) [ CC BY 2.0 ], tramite Wikimedia Commons

Il tasto M non ha una notazione su di esso perché c'è un tasto "RETURN" dedicato, quindi CTRL-M è ridondante.


2
Ad un certo livello, la misura in cui siamo ancora vincolati dalle scelte progettuali fatte per quelli che ora sembrano sistemi antichi è abbastanza sorprendente - credo sulla riflessione che (a) non sia tanto tempo fa, è solo che il ritmo del cambiamento nel frattempo è stato sorprendente e (b) se vengono prese abbastanza decisioni di progettazione, alcune di esse (specialmente quelle che non causano abbastanza problemi alle persone) sono destinate a rimanere in sospeso molto tempo dopo che le ragioni per cui scompaiono nella memoria. Comunque una strana sensazione di guardare indietro alla storia di alcune di queste cose.
Stuart Golodetz,

2
@StuartGolodetz - In realtà, lo trovo stranamente rassicurante. Ma poi ricordo quando i Teletypes erano "tecnologia avanzata". (Il Teletype ASR-33, a proposito, era notevole per la sua elegante semplicità. Vorrei solo che i sistemi "moderni" fossero ben progettati.)
Daniel R Hicks,

1
Questo è affascinante ma quello che non capisco è ... perché di tutte le cose hanno deciso che questa macchina da scrivere aveva bisogno di una campana?
CaptainCodeman,

4
@CaptainCodeman - Quando trasmettevi un messaggio importante, suonavi il campanello per attirare l'attenzione dell'operatore all'altro capo.
Daniel R Hicks,

2
È interessante notare che il tasto Ctrl sopravvive fino ad oggi sulle tastiere del PC.
Daniel R Hicks,

3

Il cursore (^) è solo una scorciatoia per la scrittura, tieni premuto il tasto Ctrl - CTRL.

Ai vecchi tempi potresti digitare questi codici (vedi sopra) direttamente, il tasto Ctrl + G (^ G) farebbe andare il terminale "ding"

Quando vuoi aggiungere un CR in Vim usi il tasto Ctrl + M etc tab = Ctrl + I


Il termine che stai cercando è digraph , che significa due caratteri che rappresentano un personaggio. In particolare, digrafi e trigrafi sono usati per rappresentare caratteri non stampabili. Storicamente sono stati usati anche per i caratteri che non compaiono su una tastiera, sebbene con le moderne GUI e tastiere questo sia un problema minore, quindi questo uso è più arcaico.

"Ai bei vecchi tempi" è ancora oggi, con ^ C e ^ D perfettamente funzionanti. L'unica ragione per cui ^ G non rende più il terminale ding è che la maggior parte degli emulatori di terminali ha quella risposta disattivata.
SevenSided

2

La necessità di un modo visivo di visualizzare quelli che sono per definizione caratteri non stampabili.

Quindi, qualcuno nei primi anni '70 (o forse prima) (ricordo di averlo visto su CP / M, e qualcun altro ha già menzionato TOPS) ha deciso che "lettera + punto di inserimento" sarebbe il simbolo per i 26 caratteri di controllo ASCII non stampabili con valori Da 1 a 26. Il valore 0 è / è stato stampato come ^ @ e il valore 127 come ^ ?.


1

Dove è documentato, questa pagina elenca tutti i caratteri di controllo, con come immetterli / rappresentarli con il tasto di controllo (sebbene il primo, il carattere ascii 0, non abbia una rappresentazione del tasto di controllo) e non ha nulla per il carattere 127. E fornisce fonti in fondo

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

Ci si potrebbe chiedere, dato che ci sono 33 caratteri di controllo (caratteri ASCII 0-31 quindi 32 caratteri, + carattere 127. così, = 33 caratteri) Come sarebbero rappresentati tutti in quanto ci sono solo 26 lettere nell'alfabeto. Bene, usa Ctrl-A per Ascii carattere 1, Ctrl-Z per ascii carattere 26, e lì una volta che raggiunge Ctrl-Z, usa [ \ ] ^ _

Elenca Ctrl-Z come SUB, sebbene in DOS e il prompt cmd sia EOF, e come utente tecnico lo usi quando fai copy con a.adov'è il a.atuo file. Inserisci il testo e lo termina con Ctrl-Z che stranamente non inserisce un marcatore EOF. Ma dice a CMD che è la fine del file, quindi CMD lo scrive.

Quella pagina web cs.tut.fi fornisce questo come fonte
http://www.wps.com/texts/codes/X3.4-1963/index.html

ma è un link non funzionante, ma disponibile su archive.org è in formato JPG

Codice standard americano per lo scambio di informazioni
standard ASA X3.4-1963

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


La maggior parte dei personaggi di controllo sono privi di significato, ma anche alcuni di quelli con significato come Ctrl-I non sono sicuro di dove si possa semplicemente fare Ctrl-I e ottenere una scheda.
barlop

1
nessuno dei personaggi di controllo è privo di significato. Molti di essi sono inutilizzati in molti contesti, ma ognuno ha almeno un significato.
Jon Hanna,

@JonHanna Ovviamente non intendo che fossero privi di significato (passato). Ma R. è stato insignificante per decenni, cioè aveva i suoi significati originali di eoni fa, la tecnologia che non corre più, oggi è (quasi tutti i caratteri) insignificante. con la tecnologia attuale e anche leggermente vecchia.n se qualcuno viene utilizzato per usi moderni non sono molti. C'è un elenco qui en.wikipedia.org/wiki/Control_character di quelli di uso comune 0,7,8,9,10,11,12,13,127. 9/33 quindi gli altri (24 di loro) potresti o raramente o per niente visto che sono morti come l'antico inutilizzato fuori uso per decenni sui macchinari su cui sono stati usati
barlop

Associated Press utilizza ancora ANPA-1312 che utilizza 1–4, 6 e 16 per avviare ogni connessione TCP / IP. Le moderne stampanti (tra le altre cose) usano ancora 17 e 19. Insieme a quelli che lei menziona, ne abbiamo abbastanza una percentuale coperta senza davvero provarci. L'ammetto non sono in pesante uso, ma non è morto neanche.
Jon Hanna,

1
@barlop Puoi fare ^Iper una scheda in bash standard: digita ls ~/^I^Ie dovresti vedere tutte le cartelle nella tua home directory.
wchargin,

0

Puoi vedere tutti i caratteri ASCII non preziosi mappati Controlin questa tabella.


5
Sebbene ciò possa teoricamente rispondere alla domanda, sarebbe preferibile includere qui le parti essenziali della risposta e fornire il collegamento come riferimento. In questo modo, se la pagina collegata dovesse mai cambiare o diventare non valida per qualsiasi motivo, la risposta sarà comunque utile ai visitatori di Super User.
un CVn

3
Grazie. Sebbene sia istruttiva, questa risposta non contiene la risposta alla domanda.
dotancohen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.