95 votes

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

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

Je suppose que M est la 13ème lettre de l'alphabet latin et un retour chariot 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. Par contre, Tab est \x09 ou décimal 9, ce qui soutient ma théorie énoncée ci-dessus. Cependant, où cela pourrait-il être documenté en tant que fait?

119voto

Ben Groot Points 2379

Je crois que ce dont l'OP parlait en réalité est appelé Notation Caret.

La notation caret est une notation pour les caractères de contrôle non imprimables dans le codage ASCII. Cette notation se compose d'un accent circonflexe (^) suivi d'une lettre capitale; ce digramme représente le code ASCII qui a la valeur numérique équivalente à la valeur numérique de la lettre. Par exemple le caractère EOT avec une valeur de 4 est représenté par ^D parce que D est la 4ème lettre de l'alphabet. Le caractère NUL avec une valeur de 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 le même que 127 si masqué sur 7 bits. Une formulation alternative de la traduction est que le caractère imprimé est trouvé en inversant le 7ème bit du code ASCII.

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

En ce qui concerne vim et d'autres éditeurs de texte: Vous verrez généralement seulement ^M si vous ouvrez un fichier texte formaté pour Windows (CRLF) dans un éditeur qui attend des fins de ligne Linux (LF). Le 0x0A est affiché comme un saut de ligne, le 0x0D juste avant est imprimé comme ^M. La plupart du temps, les paramètres par défaut de l'éditeur incluent 'reconnaître automatiquement les fins de ligne'.

22voto

Flup Points 3421

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

Traditionnellement, ces caractères sont générés avec Control et la lettre relative au caractère requis. Les téléimprimeurs et les premiers claviers de terminal avaient 'BELL' écrit au-dessus de la touche G pour cette raison.

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

14voto

Daniel R Hicks Points 6107

La notation remonte aux premiers télétypes ASCII (vers 1963). Il y avait une touche CTRL qui basculait le bit 0x40 pour que CTRL-M (retour chariot) soit 0D au lieu de 4D, CTRL-G (cloche) serait 07 au lieu de 47, CTRL-L (saut de page) serait 0C au lieu de 4C.

Il n'y avait pas de "conception" dans l'attribution de lettres particulières à des fonctions particulières, c'était juste le hasard que, lorsque la poussière retombait de l'attribution des codes ASCII, la touche M était différente d'un bit par rapport au retour chariot et donc le retour chariot devenait CTRL-M.

Voici la meilleure photo que je peux trouver d'un clavier ASR33. Comme vous pouvez le voir, les noms des caractères de contrôle sont imprimés en lettres minuscules sur les touches alpha correspondantes.

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

Image par Marcin Wichary, Utilisateur:AlanM1 (Dérivé (rogné) 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 "RETURN" dédiée, donc CTRL-M est redondant.

3voto

Don Points 31

Le symbole ^ est simplement un raccourci pour écrire maintenez enfoncée la touche Contrôle - CTRL.

Dans le bon vieux temps, vous pouviez taper ces codes (voir ci-dessus) directement, Ctrl + G (^G) faisait sonner le terminal.

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

2voto

zapoo Points 63

Le besoin de quelque manière visuelle d'afficher ce qui sont par définition des caractères non imprimables.

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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X