Por que caracteres especiais como "retorno de carro" são representados como "^ M"?

93

Por que é ^Musado 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 é \x0Dou decimal 13. É este o motivo? Essa representação está documentada em algum lugar?

Percebo que Tab é representado por ^I, que é a nona letra do alfabeto latino. Por outro lado, Tab é \x09ou decimal 9, o que apóia minha teoria acima. No entanto, onde isso pode ser documentado como fato?

dotancohen
fonte
11
Lembre-se também de que o DOS / windows usa "0x0d 0x0a", também conhecido como "CR LF". Mas o unix / linux usa apenas "0x0a" ou "LF". Então, quando você abre um documento do Windows no Linux, ele detecta "CR" extra e, quando você abre um documento do Linux no Windows, ele não detecta novas linhas.
LatinSuD
3
A notação de sinal de intercalação @LatinSuD (e o uso correspondente da tecla Ctrl) refere-se diretamente ao conjunto de controle C0 (historicamente parte do ASCII) e não se e como um determinado sistema operacional ou programa usa parte desse conjunto para representar novas linhas ou qualquer outra coisa outro. Da mesma forma, se ^Hum caractere é excluído ou permite a impressão sobreposta ( n^H~como uma maneira obsoleta de produzir ñ) ou qualquer outro uso real do caractere de controle é separado da notação de sinal de intercalação.
Jon Hanna
11
antigo ... Não me lembro do código original, mas ctrl-G toca uma campainha!
Brian Drummond
3
@OlivierDulac não, o ^ M é exatamente um retorno de carro, assim como ^ J é exatamente um avanço de linha. Embora diferentes SOs tenham visões diferentes sobre se o avanço de linha e / ou retorno de carro ou outra coisa (como o caractere Nova Linha usado por alguns caracteres IBM, mas não faz parte do ASCII e, portanto, não faz parte do patrimônio histórico de outros SOs), representam uma nova linha em um arquivo de texto e, embora alguns programas tenham substituído isso de maneiras diferentes, o próprio U + 000D ainda é um retorno de carro, quaisquer que sejam os sistemas operacionais posteriores, como Unix ou DOS, decidiram fazer isso. (Claro, chamando ...
Jon Hanna
11
@OlivierDulac ... U + 000D é prolífico, já que esse nome veio com o Unicode na década de 1990, mas isso definitivamente faz referência ao código como existia no ASCII em 1963, e através dele como existia no código Baudot modificado de Murray em 1901 Murray estava resolvendo problemas relacionados à movimentação de papel, com as mesmas ferramentas usadas no conceito de "arquivo de texto" muitas décadas depois. Martele um parafuso em algo como um prego, e ainda é um parafuso. Use LF e / ou CR para representar o final de uma linha em um arquivo de texto, e eles ainda são feeds de linha e retornos de carro.
Jon Hanna

Respostas:

115

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

A notação de intercalação é uma notação para caracteres de controle não imprimíveis na codificação ASCII. A notação consiste em um sinal de intercalação (^) seguido por uma letra maiúscula; esse dígrafo representa o código ASCII que possui o valor numérico equivalente ao valor numérico da letra. Por exemplo, o caractere EOT com um valor de 4 é representado como ^ D porque D é a quarta letra do alfabeto. O caractere NUL com um valor 0 é representado como ^ @ (@ é o caractere ASCII antes de A). O caractere DEL com o valor 127 é geralmente representado como ^ ?, porque o ASCII '?' é antes de '@' e -1 é igual a 127 se mascarado em 7 bits. Uma formulação alternativa da tradução é que o caractere impresso é encontrado invertendo o 7º bit do código ASCII

A lista completa de caracteres de controle ASCII, juntamente com a notação de sinal de intercalação, pode ser encontrada aqui

Em relação ao vim e outros editores de texto: Você normalmente verá apenas ^ M se abrir um arquivo de texto no formato Windows (CRLF) em um editor que espera finais de linha do Linux (LF). O 0x0A é renderizado 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 as terminações de linha'.

Art Gertner
fonte
11
Eu sempre me perguntei o que essa coisa foi chamado ...
SMCI
5
Esta convenção remonta pelo menos aos anos 70; Vi pela primeira vez no sistema operacional TOPS-10, mas pode ter existido anteriormente. Pelo que vale a pena, nos terminais ASCII mais antigos, o caractere agora mostrado como um sinal de intercalação era na verdade uma seta apontando para cima; portanto, isso se originou como "notação ascendente".
precisa saber é o seguinte
15
Isto é explicitamente incorporado ao projeto ASCII para que a tecla Ctrl apenas alterna bit 7.
OrangeDog
2
Não é usado apenas com letras. Eu não o definiria como o caractere de controle com "o valor numérico da letra", mas como "xor 64". Em outras palavras, ^Aé 0x41 xor 0x40, ou 0x01e ^?é 0x3F xor 0x40, ou 0x7F.
R ..
11
Ascii DEL (^?) Não tem nada a ver com a tecla delete. Na verdade, é o código padrão gerado pela <---chave (também, confusamente, chamado backspace) em terminais do tipo VT100.
..
22

Essa é exatamente a razão.

ASCII define os caracteres de 0 a 31 como códigos de controle que não imprimem. Aqui está um extrato da ascii(7)página do manual de um sistema Linux aleatório ( man ascii), incluindo 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)    

Convencionalmente, esses caracteres são gerados com Controle a letra relacionada ao caractere necessário. Teletipos e teclados iniciais de terminais tinham 'BELL' escrito acima da Gtecla por esse motivo.

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

Flup
fonte
4
Obrigado. Embora informativa, esta resposta não contém a resposta para a pergunta.
dotancohen
11
A resposta está oculta no segundo parágrafo: ^Mé uma abreviação de Control-M. No terminal, você pressionaria a tecla Control juntamente com a tecla M para enviar o código ASCII 0x0D também conhecido como retorno de carro.
Martin Liversage
14

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

Não havia "design" ao atribuir letras particulares a funções específicas, era apenas uma chance de que, quando a poeira baixasse ao atribuir códigos ASCII, a tecla M fosse um pouco diferente do retorno de carro e, portanto, o retorno de carro se tornasse CTRL-M.

Aqui está a melhor foto que 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.

Teletipo Modelo 33 ASR com furador / leitor de fita de papel

Imagem de Marcin Wichary, Usuário: AlanM1 (derivado (cortado) de Arquivo: ASR-33 2.jpg ) [ CC BY 2.0 ], via Wikimedia Commons

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

Daniel R Hicks
fonte
2
Em algum nível, a extensão em que ainda estamos limitados pelas escolhas de design feitas para o que agora parecem sistemas antigos é bastante surpreendente - acho que, refletindo que (a) não faz tanto tempo, é apenas que o ritmo da mudança nesse ínterim foi surpreendente, e (b) se forem tomadas decisões de design suficientes, algumas delas (especialmente as que não causam problemas suficientes às pessoas) provavelmente permanecerão por muito tempo depois que os motivos para elas desaparecerem na memória. Ainda é uma sensação estranha olhar para a história de algumas dessas coisas.
Stuart Golodetz
2
@StuartGolodetz - Na verdade, acho estranhamente tranquilizador. Mas então me lembro de quando os teletipos eram "tecnologia avançada". (O Teletype ASR-33, a propósito, foi notável pela sua simplicidade elegante Eu só desejo que sistemas de computadores "modernos" eram tão bem concebido..)
Daniel R Hicks
11
Isso é fascinante, mas o que eu não entendo é .. por que de todas as coisas eles decidiram que essa máquina de escrever precisava de um sino?
precisa saber é o seguinte
4
@CaptainCodeman - Quando você transmitia uma mensagem importante, tocava a campainha para chamar a atenção do operador do outro lado.
Daniel R Hicks
2
É interessante notar que a tecla Ctrl sobrevive até hoje nos teclados de PC.
Daniel R Hicks
3

O sinal de intercalação (^) é apenas uma abreviação para escrever, mantenha pressionada a tecla Control - CTRL pressionada.

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

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

Don
fonte
O termo que você está procurando é digraph , o que significa dois caracteres que representam um caractere. Especificamente, dígrafos e trigramas são usados ​​para representar caracteres não imprimíveis. Historicamente, eles também foram usados ​​para caracteres que não aparecem em um teclado, embora com GUIs e teclados modernos isso seja menos problemático, portanto esse uso é mais arcaico.
"Nos bons velhos tempos" ainda é hoje, com ^ C e ^ D sendo perfeitamente funcionais. A única razão pela qual ^ G não torna o terminal mais lento é que a maioria dos emuladores de terminal tem essa resposta desativada.
precisa saber é o seguinte
2

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

Portanto, alguém no início dos anos 70 (ou talvez mais cedo) (lembro de vê-lo no CP / M, e alguém já mencionou o TOPS) decidiu que "caret plus letter" seria o símbolo dos 26 caracteres de controle ASCII não imprimíveis com valores 1 a 26. O valor 0 é / foi impresso como ^ @ e o valor 127 como ^ ?.

RonJohn
fonte
1

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

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

Pode-se perguntar, considerando que existem 33 caracteres de controle (caracteres ASCII de 0 a 31, 32 caracteres, + caractere 127. portanto, = 33 caracteres) Como eles seriam representados, pois existem 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 no prompt do cmd seja EOF, e como usuário técnico, você o usa quando faz copy con a.aonde a.aestá o seu arquivo. Você digita o texto e o finaliza com Ctrl-Z, que engraçado o bastante não insere um marcador EOF. Mas diz ao CMD que é o fim do arquivo para que o CMD o grave.

Essa página da web cs.tut.fi fornece isso como fonte
http://www.wps.com/texts/codes/X3.4-1963/index.html

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
ASA standard X3.4-1963

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

barlop
fonte
A maioria dos caracteres de controle não tem sentido, mas mesmo alguns com significado como Ctrl-I não tenho certeza de onde você pode apenas fazer Ctrl-I e obter uma guia.
Barlop
11
nenhum dos caracteres de controle não tem sentido. Muitos deles não são utilizados em muitos contextos, mas cada um tem pelo menos um significado.
Jon Hanna
@JonHanna É claro que não quero dizer que eles não tinham sentido (tempo passado) .Ra.Tem sido sem sentido há décadas, ou seja, eles tinham seus significados originais de éons atrás, a tecnologia que não funciona mais, é (a maioria dos caracteres) hoje sem sentido. com tecnologia atual e até um pouco antiga, se houver algum que esteja sendo usado em usos modernos, não são muitos. Há uma lista aqui en.wikipedia.org/wiki/Control_character dos que são de uso comum 0,7,8,9,10,11,12,13,127. 9/33 para que os outros (24 deles) ou se tornassem raros ou
inexistentes
A Associated Press ainda usa o ANPA-1312, que usa de 1 a 4, 6 e 16, para iniciar todas as conexões TCP / IP. As impressoras modernas (entre outros itens) ainda usam 17 e 19. Junto com as mencionadas, temos uma porcentagem delas coberta sem realmente tentar. Eu garanto que eles não estão em uso pesado , mas também não estão mortos.
Jon Hanna
11
@ barlop Você pode fazer ^Iuma guia no bash: type padrão ls ~/^I^Ie deverá ver todas as pastas no diretório inicial.
wchargin
0

Você pode ver todos os não pritable caracteres ASCII Controlmapeamento no este mesa.

Ofir Luzon
fonte
5
Embora isso possa teoricamente responder à pergunta, seria preferível incluir aqui as partes essenciais da resposta e fornecer o link para referência. Dessa forma, se a página vinculada mudar ou se tornar inválida por qualquer motivo, a resposta ainda será útil para os visitantes do Superusuário.
um CVn 05/06
3
Obrigado. Embora informativa, esta resposta não contém a resposta para a pergunta.
dotancohen