Questão Por que caracteres especiais como “retorno de carro” são representados como “^ M”?


Porque é ^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, que suporta minha teoria afirmada acima. No entanto, onde isso pode ser documentado como fato?


91


origem


Também tenha em mente que dos / windows usam "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 um "CR" extra, e quando você abre um documento linux no windows ele não detecta novas linhas. - LatinSuD
A notação de intercalação @LatinSuD (e uso correspondente da tecla Ctrl) se refere ao conjunto de controle C0 (historicamente parte de ASCII) diretamente e não se e como um dado sistema operacional ou programa usa parte desse conjunto em representar novas linhas ou qualquer coisa outro. Da mesma forma, seja ^Hexclui um caractere ou permite a sobreimpressão (como n^H~ como uma maneira obsoleta de produzir ñ) ou qualquer outra usar O caractere de controle é separado da notação de circunflexo. - Jon Hanna
Um velho ... não me lembro o código original, mas ctrl-G toca um sino! - Brian Drummond
@ OlivierDulac não, o ^ M é exatamente um retorno de carro, assim como ^ J é exatamente uma linha de alimentação. Embora diferentes sistemas operacionais tenham tido visões diferentes sobre se o avanço de linha e / ou retorno de carro ou algo mais (como o caractere Newline usado por alguns caracteres IBM, mas não parte do ASCII e, portanto, não faz parte do patrimônio histórico de alguns outros sistemas operacionais) representam uma nova linha em um arquivo de texto, e embora alguns programas tenham sobrescrito de maneiras diferentes, o próprio U + 000D ainda é um retorno de carro, seja o que for que sistemas operacionais posteriores como Unix ou DOS decidiram fazer com ele. (Claro, chamando isso ... - Jon Hanna
@OlivierDulac ... U + 000D é proléptico, já que esse nome veio com Unicode nos anos 90, mas isso definitivamente faz referência ao código como existia em ASCII em 1963, e por isso 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. Martelo 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:


Eu acredito que o que OP estava realmente perguntando é chamado Notação de Caret.

A notação de intercalação é uma notação para caracteres de controle não imprimíveis em codificação ASCII. A notação consiste em um acento circunflexo (^) seguido por uma letra maiúscula; Este digrafo 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 de 0 é representado como ^ @ (@ é o caractere ASCII antes de A). O caractere DEL com o valor 127 é geralmente representado como ^ ?, porque o ASCII '?' é anterior a '@' e -1 é o mesmo que 127, se mascarado para 7 bits. Uma formulação alternativa da tradução é que o caractere impresso é encontrado invertendo o sétimo bit do código ASCII

A lista completa de caracteres de controle ASCII junto com a notação de cursor 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".


114



Eu sempre me perguntei como essa coisa era chamada ... - smci
Esta convenção remonta pelo menos aos anos 70; Eu vi pela primeira vez no sistema operacional TOPS-10, mas pode ter existido anteriormente. Para o que vale a pena, em terminais ASCII mais antigos, o caractere agora mostrado como um cursor era, na verdade, uma seta apontando para cima, de modo que isso se originou como "notação ascendente". - keshlam
Isso é explicitamente incorporado ao design ASCII, de modo que a tecla Ctrl apenas alterne o bit 7. - OrangeDog
Não é usado apenas com letras. Eu não o definiria como o caractere de controle com "o valor numérico da letra", mas sim como "xor 64". Em outras palavras, ^A é 0x41 xor 0x40ou 0x01 e ^? é 0x3F xor 0x40ou 0x7F. - R..
Ascii DEL (^?) Não tem nada a ver com a tecla delete. Na verdade, é o código padrão gerado pelo <--- key (também, confusamente, chamado backspace) em terminais do tipo VT100. - R..


Essa é exatamente a razão.

ASCII define caracteres 0 a 31 como códigos de controle que não são impressos. Aqui está um extrato do ascii(7) página de 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 personagens são gerados com Ao controle e a carta relativa ao personagem requerido. Os teletipos e os primeiros teclados terminais tinham 'BELL' escrito acima do G chave por este motivo.

O documento padrão que definiu ASCII é ASA X3.4-1963, que foi 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.


22



Obrigado. Embora informativa, essa resposta não contém a resposta para a pergunta. - dotancohen
A resposta está escondida no segundo parágrafo: ^M é uma abreviação para Control-M. No terminal, você pressionaria a tecla Control junto com a tecla M para enviar o kode ASCII 0x0D, também conhecido como retorno de carro. - Martin Liversage


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 do carro e, portanto, o retorno do carro se tornava 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.

Teletype Model 33 ASR with paper tape punch/reader

Imagem por Marcin Wichary, Usuário: AlanM1 (Derivado (recortado) 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 chave dedicada "RETURN", então o CTRL-M é redundante.


13



Em algum nível, a extensão em que ainda estamos ligados pelas escolhas de design feitas para o que agora parece ser sistemas antigos é bastante surpreendente - eu acho que na reflexão que (a) não é há muito tempo, é apenas que o ritmo da mudança no período interino tem sido espantoso, e (b) se decisões de projeto suficientes são feitas, algumas delas (especialmente aquelas que não causam problemas suficientes às pessoas) são obrigadas a permanecer por muito tempo depois que as razões para elas desaparecem na memória. Ainda uma sensação estranha de olhar para a história de algumas dessas coisas. - Stuart Golodetz
@StuartGolodetz - Na verdade, acho estranhamente reconfortante. Mas então eu me lembro quando os teletipos eram "tecnologia avançada". (O Teletipo ASR-33, a propósito, era notável por sua simplicidade elegante. Eu só queria que os sistemas de computador "modernos" fossem tão bem projetados.) - Daniel R Hicks
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? - CaptainCodeman
@CaptainCodeman - Quando você transmitir uma mensagem importante, você toca a campainha para chamar a atenção do operador do outro lado. - Daniel R Hicks
É interessante notar que a tecla Ctrl sobrevive até hoje nos teclados de PC. - Daniel R Hicks


O circunflexo (^) é apenas uma abreviação para se manter pressionada a tecla Control - CTRL pressionada.

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

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


2



O termo que você está procurando é dígrafo, 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 interfaces gráficas e teclados modernas isso seja um problema menor, portanto, esse uso é mais arcaico.
"Nos bons e velhos tempos" ainda é hoje, com ^ C e ^ D sendo perfeitamente funcionais. A única razão pela qual ^ G não faz mais o ding do terminal é que a maioria dos emuladores de terminal tem essa resposta desligada. - SevenSidedDie


A necessidade de alguma maneira 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 TOPS) decidiu que "caret plus letter" seria o símbolo para os 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 ^?


2





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

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

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, ele usa [  \  ]  ^  _ 

Ele lista Ctrl-Z como SUB, embora no DOS e o prompt cmd é EOF, e como um usuário técnico você usá-lo ao fazer copy con a.a Onde a.a é o 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 web cs.tut.fi fornece isso como uma fonte
http://www.wps.com/texts/codes/X3.4-1963/index.html

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

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

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


1



A maioria dos caracteres de controle não tem sentido, mas mesmo alguns com significados como Ctrl-I, não tenho certeza de onde você pode fazer Ctrl-I e obter uma tabulação. - barlop
Nenhum dos caracteres de controle é sem sentido. Muitos deles não são usados ​​em muitos contextos, mas cada um tem pelo menos um significado. - Jon Hanna
@JonHanna É claro que não quero dizer que eles não tenham sentido (passado). Mas R. Não tem sentido há décadas, ou seja, eles tiveram seus significados originais há eras atrás, tecnologia que não funciona mais, é (a maioria dos caracteres) sem sentido hoje w / tech atual e até um pouco velho.n se algum está sendo colocado para usos modernos não é muitos. Tem uma lista aqui en.wikipedia.org/wiki/Control_character  dos de uso comum 0,7,8,9,10,11,12,13,127. 9/33 para que os outros (24 deles) u ou c muito raramente ou não em todos como eles tão mortos como o antic não utilizado fora de uso por décadas máquinas eles foram usados ​​em - barlop
Associated Press ainda usa ANPA-1312, que usa 1-4, 6 e 16 são usados ​​para iniciar todas as conexões TCP / IP. Impressoras modernas (entre outras coisas) ainda usam 17 e 19. Juntamente com aqueles que você mencionou, temos uma porcentagem deles coberta sem realmente tentar. Eu vou te garantir que eles não estão pesado use, mas eles não estão mortos também. - Jon Hanna
@barlop Você pode fazer ^I para uma guia no bash padrão: type ls ~/^I^I e você deve ver todas as pastas no seu diretório pessoal. - wchargin


Você pode ver todos os caracteres ASCII não-pritable Ao controle mapeamento em esta mesa.


0



Embora isso possa teoricamente responder à pergunta, seria preferível para incluir aqui as partes essenciais da resposta e fornecer o link para referência. Dessa forma, se a página vinculada for alterada ou se tornar inválida por algum motivo, a resposta ainda será útil para os visitantes do Superusuário. - Michael Kjörling
Obrigado. Embora informativa, essa resposta não contém a resposta para a pergunta. - dotancohen