web-dev-qa-db-fra.com

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

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

Mon hypothèse est que M est la 13ème lettre de l'alphabet latin et qu'un retour à la ligne est \x0D ou dé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 \x09 ou décimal 9, ce qui confirme ma théorie énoncée ci-dessus. Cependant, où cela pourrait-il être documenté comme un fait?

93
dotancohen

Je crois que ce que l’OP demandait réellement 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 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 ASCII caractères de contrôle ainsi que la notation du curseur 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".

115
Art Gertner

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 page de manuel ascii(7) d’un système Linux aléatoire (man ascii), jusqu’à 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)    

Conventionnellement, ces caractères sont générés avec Control et la lettre relative au personnage requis. Les claviers et les premiers claviers de terminaux avaient "Bell" écrits au-dessus G clé pour cette raison.

Le document de normes définissant ASCII est ASA X3.4-1963 , publié par l'American Standards Association en 1963. I ne peut pas trouver le document original sur leur site web, mais cet extrait du document original montre le tableau de caractères, y compris les codes de contrôle ci-dessus.

22
Flup

La notation remonte aux premiers ASCII télétypes (vers 1963). Une clé CTRL activait le bit 0x40 pour que CTRL-M (retour chariot) soit 0D au lieu de 4D, CTRL-G (cloche) 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 la poussière liée à l’attribution de codes ASCII ait disparu, la touche M différait un peu du retour chariot et que ce retour 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.

Teletype Model 33 ASR with paper tape punch/reader

Image par Marcin Wichary, utilisateur: AlanM1 (dérivé (recadré) à partir de 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.

14
Daniel R Hicks

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

Au bon vieux temps, vous pouviez taper ces codes (voir ci-dessus) directement, les touches Ctrl + G (^ G) feraient passer le terminal à "Ding"

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

3
Don

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 "lettre plus le curseur" serait le symbole des 26 caractères non imprimables ASCII caractères de contrôle avec les valeurs 1 à 26. La valeur 0 est/a été imprimée sous la forme ^ @ et la valeur 127 sous la forme ^ ?.

2
RonJohn

Où est-il documenté, ainsi cette page liste tous les caractères de contrôle, avec la façon de les entrer/représenter avec la clé de contrôle (bien que le premier, le caractère ascii 0, n’a pas de représentation de 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 existe 33 caractères de contrôle (caractères ASCII 0-31 donc 32 caractères, + caractère 127. Donc, = 33 caractères). Comment ils seraient tous représentés car il n’ya que 26 lettres dans l’alphabet. 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 soit EOF, et en tant qu'utilisateur technique, vous l'utilisez lorsque vous faites copy con a.a, où a.a est 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 américain normalisé pour l'échange d'information
Norme ASA X3.4-1963

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

1
barlop