Por que caracteres especiais como “carriage return” são representados como “^ M”?

93

Por que ^M é usado para representar um retorno de carro no VIM e em outros contextos?

Meu palpite é que M é a 13ª letra do alfabeto latino e um retorno de carro é \x0D ou decimal 13 . É este o motivo? Esta representação é documentada em algum lugar?

Eu noto que Tab é representado por ^I , que é a nona letra do alfabeto latino. Por outro lado, Tab é \x09 ou decimal 9 , o que suporta minha teoria declarada acima. No entanto, onde isso pode ser documentado como fato?

    
por dotancohen 05.06.2014 / 10:31

7 respostas

115

Acredito que o que o OP estava realmente perguntando é chamado de Caret Notation .

Caret notation is a notation for unprintable control characters in ASCII encoding. The notation consists of a caret (^) followed by a capital letter; this digraph stands for the ASCII code that has the numerical value equivalent to the letter's numerical value. For example the EOT character with a value of 4 is represented as ^D because D is the 4th letter in the alphabet. The NUL character with a value of 0 is represented as ^@ (@ is the ASCII character before A). The DEL character with the value 127 is usually represented as ^?, because the ASCII '?' is before '@' and -1 is the same as 127 if masked to 7 bits. An alternative formulation of the translation is that the printed character is found by inverting the 7th bit of the ASCII code

A lista completa de caracteres de controle ASCII junto com a notação de circunflexo pode ser encontrada aqui

Em relação ao vim e a outros editores de texto: Você normalmente só verá ^ M se abrir um arquivo de texto formatado pelo Windows (CRLF) em um editor que espera terminações de linha do Linux (LF). O 0x0A é processado como uma quebra de linha, o 0x0D antes de ser impresso como ^ M. Na maioria das vezes, as configurações padrão do editor incluem "reconhecer automaticamente os términos de linha".

    
por 05.06.2014 / 11:12
22

Essa é exatamente a razão.

ASCII define os caracteres 0-31 como códigos de controle sem impressão. Aqui está um extrato da ascii(7) página de manual de um sistema Linux aleatório ( man ascii ), até e incluindo CR (13):

   Oct   Dec   Hex   Char                       
   ─────────────────────────────────────────────
   000   0     00    NUL '
   Oct   Dec   Hex   Char                       
   ─────────────────────────────────────────────
   000   0     00    NUL '%pre%'                    
   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)    
' 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)

Convencionalmente, esses caracteres são gerados com Controle e a letra referente ao caractere requerido. Teletipos e teclados de terminal antigos tinham 'BELL' escrito acima da chave G por esse motivo.

O documento de normas que definiu o ASCII é ASA X3.4-1963 , publicado pela American Standards Association em 1963. Não consigo encontrar o documento original em seu site, mas este extrato do documento original mostra a tabela de caracteres, incluindo os códigos de controle acima.

    
por 05.06.2014 / 10:38
14

A notação remonta aos primeiros Teletipos ASCII (ca 1963). Havia uma chave CTRL que alternava o bit 0x40 para que CTRL-M (retorno de carro) fosse 0D em vez de 4D, CTRL-G (sino) seria 07 em vez de 47, CTRL-L (feed de formulário) seria 0C de 4C.

Não havia "design" na atribuição de letras específicas a funções específicas, era apenas a chance de que, quando a poeira resolvia a atribuição de códigos ASCII, a chave M era um pouco diferente do retorno de carro e, portanto, o retorno do carro se tornava CTRL-M .

Aqui está a melhor foto que eu posso encontrar de um teclado ASR33. Como você pode ver, os nomes dos caracteres de controle são impressos em letras minúsculas nas teclas alfa correspondentes.

Imagem de Marcin Wichary, Usuário: AlanM1 (Derivado (recortado) de ) [CC BY 2.0 ], via Wikimedia Commons

A tecla M não possui uma notação porque existe uma chave dedicada "RETURN", então o CTRL-M é redundante.

    
por 07.06.2014 / 00:01
3

O acento circunflexo (^) é apenas uma abreviação para escrever em espera a tecla Control - CTRL para baixo.

Nos bons e velhos tempos, você poderia digitar esses códigos (veja acima) diretamente, tecla Ctrl + G (^ G) faria o terminal "ding"

Quando você quiser adicionar um CR no Vim, use a tecla Ctrl + M etc tab = Ctrl + I

    
por 06.06.2014 / 16:32
2

A necessidade de alguma forma visual de exibir o que são, por definição, caracteres não imprimíveis.

Então, alguém no início dos anos 1970 (ou talvez antes) (eu me lembro de ver no CP / M, e alguém já mencionou o TOPS) decidiu que o "caret plus letter" seria o símbolo do 26 controle ASCII não imprimível caracteres com valores de 1 a 26. O valor 0 é / foi impresso como ^ @ e o valor 127 como ^ ?.

    
por 09.06.2014 / 02:51
1

Onde está documentado, bem, esta página lista todos os caracteres de controle, como inserir / representar com a tecla de controle (embora o primeiro, o caractere ascii 0, não tenha representação de chave de controle), e não tem nada para caracter 127. E fornece fontes na parte inferior

link

Pode-se perguntar, dado que há 33 caracteres de controle (caracteres ASCII 0-31, então 32 caracteres, + caractere 127. então, = 33 caracteres). Como eles seriam todos representados, pois há apenas 26 letras no alfabeto. Bem, ele usa Ctrl-A para o caractere Ascii 1, Ctrl-Z para o caractere ascii 26, e quando chega ao Ctrl-Z, usa [ \ ] ^ _

Ele lista Ctrl-Z como SUB, embora no DOS e o prompt do cmd seja EOF, e como um usuário técnico você o usa ao fazer copy con a.a onde a.a é seu arquivo. Você insere o texto e finaliza com Ctrl-Z, o que, curiosamente, não entra em um marcador EOF. Mas diga ao CMD que é o fim do arquivo para que o CMD o grave.

Essa página da cs.tut.fi fornece isso como uma fonte de link

mas é um link quebrado, mas disponível em archive.org é na forma de JPGs

Código Padrão Americano para Intercâmbio de Informações
Padrão ASA X3.4-1963

link

    
por 05.06.2014 / 20:25
0

Você pode ver todos os caracteres ASCII não-práticos Control mapeando este tabela.

    
por 05.06.2014 / 10:46