Pourquoi les caractères spéciaux tels que «retour chariot» sont-ils représentés par «^ M»?

93

Pourquoi est-il ^Mutilisé pour représenter un retour chariot dans VIM et d'autres contextes?

À mon avis, il Ms’agit de la 13ème lettre de l’alphabet latin et un retour à la ligne est \x0Ddécimal 13. Est-ce la raison? Cette représentation est-elle documentée quelque part?

Je remarque que Tab est représenté par ^I, qui est la neuvième lettre de l'alphabet latin. Inversement, Tab est \x09ou décimal 9, ce qui appuie ma théorie énoncée ci-dessus. Cependant, où cela pourrait-il être documenté comme un fait?

dotancohen
la source
1
N'oubliez pas non plus que dos / Windows utilise "0x0d 0x0a", également appelé "CR LF". Mais unix / linux utilise seulement "0x0a" ou "LF". Ainsi, lorsque vous ouvrez un document Windows sous Linux, il détecte un "CR" supplémentaire, et lorsque vous ouvrez un document Linux dans Windows, il ne détecte pas de nouvelles lignes.
LatinSuD
3
La notation @LatinSuD caret (et l'utilisation correspondante de la touche Ctrl) se rapportent directement au jeu de contrôles C0 (faisant historiquement partie de l'ASCII) et non à la question de savoir si un système d'exploitation ou un programme utilise une partie de ce jeu pour représenter de nouvelles lignes autre. De la même manière, le fait de ^Hsupprimer un caractère ou de permettre la surimpression (telle qu'une n^H~méthode obsolète de produire ñ) ou toute autre utilisation réelle du caractère de contrôle est distinct de la notation caret.
Jon Hanna
11
vieux ... Je ne me souviens plus du code original, mais ctrl-G sonne la cloche!
Brian Drummond
3
@OlivierDulac Non, le ^ M est exactement un retour chariot, tout comme ^ J est exactement un saut de ligne. Bien que différents systèmes d’exploitation aient eu des points de vue différents quant à savoir si un saut de ligne et / ou un retour à la ligne ou autre chose (comme le caractère Newline utilisé par certains caractères IBM mais ne faisant pas partie de l’ASCII et ne faisant donc pas partie du patrimoine historique de certains autres systèmes d’exploitation), représente une nouvelle ligne dans un fichier texte et, bien que certains programmes l'aient ensuite modifiée de différentes manières, U + 000D est toujours un retour chariot, quels que soient les systèmes d'exploitation ultérieurs tels qu'Unix ou DOS. (Bien sûr, l'appelant ...
Jon Hanna
1
@OlivierDulac ... U + 000D est proleptique, puisque ce nom est venu avec Unicode dans les années 1990, mais cela fait clairement référence au code tel qu'il existait dans ASCII en 1963, et à travers celui qui existait dans le code Baudot modifié de Murray en 1901 Murray résolvait les problèmes liés au déplacement du papier, avec les mêmes outils que ceux utilisés dans le concept de "fichier texte" plusieurs décennies plus tard. Enfoncez une vis dans quelque chose qui ressemble à un clou, et c'est toujours une vis. Utilisez LF et / ou CR pour représenter la fin d'une ligne dans un fichier texte. Ils sont toujours des sauts de ligne et des retours à la ligne.
Jon Hanna

Réponses:

115

Je pense que la question posée par OP s'appelle Caret Notation .

La notation Caret est une notation pour les caractères de contrôle non imprimables en codage ASCII. La notation consiste en un signe (^) suivi d'une lettre majuscule; Ce digraphe représente le code ASCII dont la valeur numérique est équivalente à la valeur numérique de la lettre. Par exemple, le caractère EOT avec une valeur de 4 est représenté par ^ D car D est la 4ème lettre de l'alphabet. Le caractère NUL avec la valeur 0 est représenté par ^ @ (@ est le caractère ASCII avant A). Le caractère DEL avec la valeur 127 est généralement représenté par ^?, Car le caractère ASCII '?' est avant '@' et -1 est égal à 127 s'il est masqué sur 7 bits. Une autre formulation de la traduction est que le caractère imprimé est trouvé en inversant le septième bit du code ASCII.

La liste complète des caractères de contrôle ASCII ainsi que la notation caret peuvent être trouvés ici.

En ce qui concerne vim et les autres éditeurs de texte: vous ne verrez généralement ^ M que si vous ouvrez un fichier texte au format Windows (CRLF) dans un éditeur qui attend des fins de ligne Linux. Le 0x0A est rendu sous la forme d'un saut de ligne, le 0x0D juste avant d'être imprimé en tant que ^ M. La plupart du temps, les paramètres par défaut de l'éditeur incluent "reconnaître automatiquement les fins de ligne".

Art Gertner
la source
1
Je me suis toujours demandé comment cette chose s'appelait ...
smci
5
Cette convention remonte au moins aux années 1970; Je l'ai d'abord vu sur le système d'exploitation TOPS-10, mais il a peut-être déjà existé. Pour ce qui en vaut la peine, sur les anciens terminaux ASCII, le caractère affiché sous forme de curseur était en fait une flèche dirigée vers le haut. Il s’agit donc d’une "notation vers le haut".
Keshlam
15
Ceci est explicitement intégré à la conception ASCII, de sorte que la touche Ctrl bascule simplement le bit 7.
OrangeDog
2
Ce n'est pas utilisé uniquement avec des lettres. Je ne le définirais pas comme le caractère de contrôle avec "la valeur numérique de la lettre" mais plutôt comme "xor 64". En d'autres termes, ^Aest 0x41 xor 0x40, ou 0x01et ^?est 0x3F xor 0x40, ou 0x7F.
R ..
1
Ascii DEL (^?) N'a rien à voir avec la touche Suppr. Il s’agit en fait du code standard généré par la <---clé (appelée également backspace) sur les terminaux de type VT100.
R ..
22

C'est exactement la raison.

ASCII définit les caractères 0 à 31 comme des codes de contrôle non imprimables. Voici un extrait de la ascii(7)page de manuel d’un système Linux aléatoire ( man ascii), y compris 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)    

Classiquement, ces caractères sont générés avec Controlet la lettre relative au caractère requis. GPour cette raison, 'BELL' était écrit au-dessus de la touche des télétypes et des premiers claviers de terminaux .

Le document de normes définissant ASCII est ASA X3.4-1963 , publié par l'American Standards Association en 1963. Je ne trouve pas le document d'origine sur leur site Web, mais cet extrait du document d'origine présente le tableau des caractères, y compris: les codes de contrôle ci-dessus.

Flup
la source
4
Je vous remercie. Bien qu'informative, cette réponse ne contient pas la réponse à la question.
dotancohen
1
La réponse est cachée dans le deuxième paragraphe: ^Mest un raccourci pour Control-M. Sur le terminal, vous devez appuyer sur la touche Ctrl et sur la touche M pour envoyer le kode 0xII ASCII, également appelé retour chariot.
Martin Liversage
14

La notation remonte aux premiers télétypes ASCII (vers 1963). Une clé CTRL a basculé le bit 0x40 de sorte que CTRL-M (retour chariot) soit 0D au lieu de 4D, CTRL-G (sonnerie) soit 07 au lieu de 47, CTRL-L (saut de page) soit 0C de 4C.

Il n’existait pas de "conception" dans l’attribution de lettres particulières à des fonctions particulières. Il était donc fort probable que, lorsque les codes ASCII ont été assignés, la touche M différait un peu du retour chariot et que le retour chariot devenait alors CTRL-M.

Voici le meilleur cliché que je puisse trouver d'un clavier ASR33. Comme vous pouvez le constater, les noms des caractères de contrôle sont imprimés en petites lettres sur les touches alpha correspondantes.

Télétype Modèle 33 ASR avec perforateur / lecteur de bande de papier

Image de Marcin Wichary, utilisateur: AlanM1 (dérivé (recadré) du fichier: ASR-33 2.jpg ) [ CC BY 2.0 ], via Wikimedia Commons

La touche M n'a pas de notation car il y a une touche "RETOUR" dédiée. CTRL-M est donc redondant.

Daniel R Hicks
la source
2
À un certain niveau, la mesure dans laquelle nous sommes toujours liés par les choix de conception effectués pour ce qui semble maintenant être des systèmes anciens est assez surprenante - je suppose qu'après réflexion (a) il n'y a pas si longtemps, c'est simplement que le rythme du changement dans l'intervalle a été étonnante, et (b) si suffisamment de décisions de conception sont prises, certaines d’entre elles (en particulier celles qui ne causent pas assez de problèmes aux gens) resteront immuables longtemps après que leurs raisons ont disparu. Reste cependant un sentiment étrange de revenir sur l’histoire de certaines de ces choses.
Stuart Golodetz
2
@StuartGolodetz - En fait, je trouve cela étrangement rassurant. Mais ensuite, je me souviens que les télétypes étaient une "technologie avancée". (Le télétype ASR-33, au fait, était remarquable par son élégante simplicité. Je souhaite seulement que les systèmes informatiques "modernes" soient aussi bien conçus.)
Daniel R Hicks
1
C’est fascinant, mais ce que je ne comprends pas, c’est pourquoi ils ont décidé que cette machine à écrire avait besoin d’une clochette?
CaptainCodeman
4
@CaptainCodeman - Lorsque vous transmettez un message important, vous sonnez pour attirer l'attention de l'opérateur à l'autre bout.
Daniel R Hicks
2
Il est intéressant de noter que la touche Ctrl est encore utilisée sur les claviers PC.
Daniel R Hicks
3

Le signe d'insertion (^) est juste un raccourci pour l'écriture, maintenez la touche Contrôle - CTRL enfoncée.

Dans le bon vieux temps, vous pouviez taper ces codes (voir ci-dessus) directement, les touches Ctrl + G (^ G) feraient "ding"

Lorsque vous voulez ajouter un CR dans Vim, utilisez la touche Ctrl + M, etc. tab = Ctrl + I

Don
la source
Le terme que vous recherchez est digraphe , ce qui signifie deux caractères représentant un seul caractère. Spécifiquement, les graphes numériques et trigraphiques sont utilisés pour représenter des caractères non imprimables. Historiquement, ils ont également été utilisés pour les caractères qui n'apparaissent pas sur un clavier, bien qu'avec les interfaces graphiques et les claviers modernes, le problème soit moins grave, de sorte que cette utilisation est plus archaïque.
"Au bon vieux temps" est encore aujourd'hui, avec ^ C et ^ D parfaitement fonctionnels. La seule raison pour laquelle ^ G ne rend plus le terminal dingue, c'est que la plupart des émulateurs de terminaux ont cette réponse désactivée.
SevenSidedDie
2

La nécessité d'une manière visuelle d'afficher ce qui sont par définition des caractères non imprimables.

Ainsi, au début des années 1970 (ou peut-être plus tôt) (je me souviens de l'avoir vu sur CP / M, et quelqu'un d'autre a déjà mentionné TOPS), il a décidé que "caret plus letter" serait le symbole des 26 caractères de contrôle ASCII non imprimables avec des valeurs. 1 à 26. La valeur 0 est / était imprimée sous la forme ^ @ et la valeur 127 sous la forme ^ ?.

RonJohn
la source
1

Où est-il documenté, ainsi cette page répertorie chaque caractère de contrôle, avec la façon de le saisir / représenter avec la clé de contrôle (bien que le premier, le caractère ascii 0, n’a pas de représentation de la clé de contrôle), et il n’a rien pour le caractère 127. Et il fournit des sources en bas

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

On peut s’interroger, étant donné qu’il ya 33 caractères de contrôle (caractères ASCII de 0 à 31, donc 32 caractères, + 127 caractères, donc, = 33 caractères). Comment ils seraient tous représentés, l’alphabet ne comportant que 26 lettres. Eh bien, il utilise Ctrl-A pour le caractère Ascii 1, Ctrl-Z pour le caractère ascii 26, et une fois qu’il atteint Ctrl-Z, il utilise [ \ ] ^ _

Il répertorie Ctrl-Z en tant que SUB, bien que sous DOS et l’invite cmd il s’agisse de EOF, et en tant qu’utilisateur technique, vous l’utilisez quand vous faites copy con a.aa.aest votre fichier. Vous entrez le texte et le terminez avec Ctrl-Z qui, curieusement, n'entre pas de marqueur EOF. Mais ne dit pas à CMD que c'est la fin du fichier, donc CMD l'écrit.

Cette page Web cs.tut.fi donne ceci comme source
http://www.wps.com/texts/codes/X3.4-1963/index.html

mais c'est un lien brisé, mais disponible sur archive.org c'est sous forme de JPG

Code American Standard pour l'échange d'informations
ASA standard X3.4-1963

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

barlop
la source
La plupart des caractères de contrôle n'ont pas de sens, mais même certains de ceux qui ont un sens comme Ctrl-I. Je ne sais pas où vous pouvez simplement faire Ctrl-I et obtenir un onglet.
Barlop
1
aucun des caractères de contrôle n'a pas de sens. Beaucoup d'entre eux sont inutilisés dans de nombreux contextes, mais chacun d'entre eux a au moins une signification.
Jon Hanna
@JonHanna Bien sûr, je ne veux pas dire qu'ils n'avaient pas de sens (temps passé). Mais R. n'a eu aucun sens pendant des décennies, c'est-à-dire qu'ils avaient leur signification originale d'ère antérieure, la technologie qui ne fonctionne plus est (la plupart des personnages) sans signification aujourd'hui Avec les technologies actuelles et même un peu anciennes, si elles sont utilisées à des fins modernes, elles ne sont pas nombreuses. Il y a une liste ici en.wikipedia.org/wiki/Control_Control de ceux qui sont couramment utilisés 0,7,8,9,10,11,12,13,127. 9/33, donc les autres (24 d'entre eux) seraient soit très rarement, soit pas du tout, car ils étaient aussi morts que les machines inutilisées depuis des décennies, machines sur
lesquelles
Associated Press utilise toujours ANPA-1312 qui utilise 1–4, 6 et 16 pour démarrer chaque connexion TCP / IP. Les imprimantes modernes (entre autres) utilisent encore les versions 17 et 19. Avec celles que vous avez mentionnées, nous en couvrons un pourcentage considérable sans vraiment essayer. Je vous l'accorde, ils ne sont pas très utilisés, mais ils ne sont pas morts non plus.
Jon Hanna
1
@barlop Vous pouvez faire ^Ipour un onglet dans bash standard: type ls ~/^I^Iet vous devriez voir tous les dossiers de votre répertoire personnel.
wchargin
0

Vous pouvez voir tous les mappages de caractères ASCII non prisables Controldans ce tableau.

Ofir Luzon
la source
5
Bien que cela puisse théoriquement répondre à la question, il serait préférable d’inclure ici les parties essentielles de la réponse et de fournir le lien à titre de référence. Ainsi, si la page liée change ou devient invalide pour une raison quelconque, la réponse sera toujours utile aux visiteurs de Super User.
un CVn
3
Je vous remercie. Bien qu'informative, cette réponse ne contient pas la réponse à la question.
dotancohen