Diferença entre os tipos de quebra de linha CR LF, LF e CR?

759

Gostaria de saber a diferença (com exemplos, se possível) entre os tipos de quebra de linha CR LF (Windows), LF (Unix) e CR (Macintosh).

eozzy
fonte
9
Muito semelhante, mas não uma duplicata exata . \nnormalmente é representado por um avanço de linha, mas não é necessariamente um avanço de linha.
Adrian McCarthy
92
CR e LF são ASCII e caracteres de controle Unicode enquanto \re \nsão abstrações utilizadas em determinadas linguagens de programação. Fechar esta pergunta encobre as diferenças fundamentais entre as perguntas e perpetua a desinformação.
Adrian McCarthy
5
@AdrianMcCarthy É um problema a maneira como os votos próximos agem como respostas; uma resposta afirmando que os dois eram os mesmos poderia ser votada com desdém e depois acinzentada como muito, muito errada, mas são necessários apenas 4 votos concordantes (comparáveis ​​aos upvotes) para que ocorra um fechamento muito errado, sem maneira de contrariar a votação até depois aconteceu.
Jon Hanna
Essa formulação da questão é reconhecidamente melhor, mas ainda é para todos os efeitos práticos a mesma pergunta.
Jukka K. Korpela
6
@ JukkaK.Korpela: Não, realmente não é. \nnão significa a mesma coisa em todas as linguagens de programação.
Adrian McCarthy

Respostas:

349

É realmente apenas sobre quais bytes são armazenados em um arquivo. CRé um bytecode para retorno de carro (a partir dos dias das máquinas de escrever) e da LFmesma forma, para avanço de linha. Apenas se refere aos bytes que são colocados como marcadores de fim de linha.

Muito mais informações, como sempre, na wikipedia .

Pedro
fonte
53
Eu acho que também é útil mencionar que CRé o caractere de escape \re LFé o caractere de escape \n. Além disso, Wikipedia: Newline .
Robert Vunabandi
1
Em palavras simples, CR and LFé apenas o fim da linha e a nova linha de acordo com este link , isso está correto?
shaijut 18/09/19
@shaijut CR significa Retorno de carro. Foi isso que devolveu a carruagem às máquinas de escrever. Então, principalmente correto.
AliFurkan
763

CR e LF são caracteres de controle, respectivamente codificados 0x0D(13 decimais) e 0x0A(10 decimais).

Eles são usados ​​para marcar uma quebra de linha em um arquivo de texto. Como você indicou, o Windows usa dois caracteres na sequência CR LF; O Unix usa apenas LF e o MacOS antigo (MacIntosh anterior ao OSX) usava CR.

Uma perspectiva histórica apócrifa:

Conforme indicado por Peter , CR = retorno de carro e LF = avanço de linha , duas expressões têm suas raízes nas máquinas de escrever antigas / TTY. LF moveu o papel para cima (mas manteve a posição horizontal idêntica) e CR trouxe de volta o "carro" para que o próximo caractere digitado ficasse na posição mais à esquerda no papel (mas na mesma linha). CR + LF estava fazendo as duas coisas, ou seja, preparando-se para digitar uma nova linha. Com o passar do tempo, a semântica física dos códigos não se aplicava, e como a memória e o espaço em disco eram escassos, alguns designers de sistemas operacionais decidiram usar apenas um dos personagens, mas não se comunicaram muito bem; -)

A maioria dos editores de texto modernos e aplicativos orientados a texto oferecem opções / configurações etc. que permitem a detecção automática da convenção de fim de linha do arquivo e a exibição em conformidade.

mjv
fonte
11
então, na verdade, o Windows é o único sistema operacional que usa esses caracteres corretamente, retorno de carro, seguido por um avanço de linha.
Rolf
4
Seria preciso, então, dizer que um arquivo de texto criado no Windows é o mais compatível dos três, ou seja, o mais provável de ser exibido nos três subconjuntos do SO?
Prometheus
3
@Hashim, ele pode ser exibido corretamente, mas tentar executar um script de shell de texto com retornos de carro geralmente resultará em um erro #
315 de Omer
Em palavras simples, CR and LFé apenas o fim da linha e a nova linha de acordo com este link , isso está correto?
shaijut 18/09/19
Descobri que alguns arquivos no estilo Windows ( CR+LF) podem ser exibidos com novas linhas duplas em outros sistemas. Presumivelmente, o editor que exibe o texto oferece suporte ao retorno de carro e ao avanço de linha como delimitadores de nova linha e, como tal, pode criar 2 linhas onde 1 foi planejado. Portanto, embora CR+LFpossa ser o mais compatível, acho que não há problemas.
Magnus Bull
459

Este é um bom resumo que encontrei:

O caractere de retorno de carro (CR) ( 0x0D, \r) move o cursor para o início da linha sem avançar para a próxima linha. Esse caractere é usado como um novo caractere de linha nos sistemas operacionais Commodore e Early Macintosh (OS-9 e versões anteriores).

O caractere Line Feed (LF) ( 0x0A, \n) move o cursor para baixo até a próxima linha sem retornar ao início da linha. Esse caractere é usado como um novo caractere de linha em sistemas baseados em UNIX (Linux, Mac OSX, etc)

A sequência de fim de linha (EOL) ( 0x0D 0x0A, \r\n) é na verdade dois caracteres ASCII, uma combinação dos caracteres CR e LF. Move o cursor para baixo até a próxima linha e o início dessa linha. Esse caractere é usado como um caractere de nova linha na maioria dos outros sistemas operacionais não Unix, incluindo Microsoft Windows, Symbian OS e outros.

Fonte

Taylor Leese
fonte
1
O caractere "aba vertical" move o cursor para baixo e mantém a posição na linha, não o caractere LF. O LF é EOL.
12431234123412341234123
2
@TaylorLeese / r / n e / n / r são iguais?
Vicrobot 22/09
175

Como não há resposta afirmando exatamente isso, resumimos sucintamente:

Retorno de carro (MAC pré-OSX)

  • CR
  • \ r
  • Código ASCII 13

Alimentação de linha (Linux, MAC OSX)

  • LF
  • \ n
  • Código ASCII 10

Retorno de carro e avanço de linha (Windows)

  • CRLF
  • \ r \ n
  • Código ASCII 13 e, em seguida, código ASCII 10

Se você vir código ASCII em um formato estranho, eles são apenas o número 13 e 10 em uma base / raiz diferente, geralmente a base 8 (octal) ou a base 16 (hexadecimal).

http://www.bluesock.org/~willg/dev/ascii.html

ahnbizcad
fonte
46

Jeff Atwood publicou recentemente um post no blog: The Great Newline Schism

Aqui está a essência da Wikipedia :

A sequência CR + LF era de uso comum em muitos sistemas de computadores antigos que adotavam máquinas de teletipo, normalmente um ASR33, como um dispositivo de console, porque essa sequência era necessária para posicionar essas impressoras no início de uma nova linha. Nesses sistemas, o texto era frequentemente rotineiramente composto para ser compatível com essas impressoras, pois o conceito de drivers de dispositivo que escondia esses detalhes de hardware do aplicativo ainda não estava bem desenvolvido; os aplicativos precisavam conversar diretamente com a máquina de teletipo e seguir suas convenções.A separação das duas funções ocultava o fato de que a cabeça de impressão não podia retornar da extrema direita para o início da próxima linha no tempo de um caractere. É por isso que a sequência sempre foi enviada com o CR primeiro. De fato, muitas vezes era necessário enviar caracteres extras (CRs ou NULs estranhos, que são ignorados) para dar tempo ao cabeçote de impressão para mover para a margem esquerda. Mesmo depois que os teletipos foram substituídos por terminais de computador com taxas de transmissão mais altas, muitos sistemas operacionais ainda suportavam o envio automático desses caracteres de preenchimento, para compatibilidade com terminais mais baratos que exigiam vários tempos de caracteres para rolar a tela.

Manu
fonte
5
+1 É por esse entendimento simples que eu sempre lembro em que ordem a combinação vem. Ainda hoje ainda podemos ver essa lógica mecânica em qualquer impressora jato de tinta (eu adoro entender porque odeio aprender). Meus outros truques de memória são: "mac? Retornar ao remetente" e "NewLineFeed" (lembrar que NL === LF e lembrar o \ n, já que o CR já tem o R na abreviação)
GitaarLAB
3
"Eu sou duvidoso ... dois códigos de controle eram necessários para o tempo". Não é o que diz. Ele diz que os CRs e NULs extras estão aqui para dar tempo para que ele volte, não o CR LF original.
Julien Rousseau
11
@Adrian Você vai ter uma experiência pessoal? 1) Nos meus velhos tempos de teletipo, a impressora que usamos exigia <CR><CR><LF>- então é claro que experimentei apenas uma <CR>. Enviei <CR><LF>Adepois de uma longa fila e você podia ouvir o que Aestava sendo impresso antes que a carruagem retornasse completamente.
John Burger
11
@ Adrian 2) Não se esqueça, isso foi na era eletromecânica, onde cada personagem fazia exatamente uma função. Em geral, enfatizamos uma palavra imprimindo a linha, enviando <CR><CR>e digitando o número correto de espaços e reimprimindo a mesma palavra: uma forma primitiva de negrito.
21816 John BurgerJan
3
@ Adrian 3) E, finalmente, isso estava usando Baudot (ou código Murray), não ASCII. Cinco bits de dados, entre um bit inicial e um e meio e bits de parada. Como você pode ter um pouco? Esperando meio tempo antes de começar a enviar o próximo caractere, para dar tempo à cabeça de impressão para retornar ao centro.
John Burger
16

CR - código ASCII 13

Código LF - ASCII 10.

Teoricamente, CR retorna o cursor para a primeira posição (à esquerda). LF alimenta uma linha movendo o cursor uma linha para baixo. É assim que antigamente você controlava impressoras e monitores em modo de texto. Esses caracteres geralmente são usados ​​para marcar o final das linhas em arquivos de texto. Sistemas operacionais diferentes usavam convenções diferentes. Como você apontou, o Windows usa a combinação CR / LF, enquanto os Macs pré-OSX usam apenas CR e assim por diante.

DmitryK
fonte
7

Os sistemas baseados em ASCII ou em um conjunto de caracteres compatível usam LF (avanço de linha, 0x0A, 10 em decimal) ou CR (retorno de carro, 0x0D, 13 em decimal) individualmente ou CR seguido por LF (CR + LF, 0x0D 0x0A); Esses caracteres são baseados nos comandos da impressora: A alimentação de linha indica que uma linha de papel deve sair da impressora e um retorno de carro indica que o carro da impressora deve retornar ao início da linha atual.

Aqui estão os detalhes .

pierrotlefou
fonte
5

O triste estado de "separadores de registros" ou "terminadores de linha" é um legado da idade das trevas da computação.

Agora, assumimos que tudo o que queremos representar é, de alguma forma, dados estruturados e está em conformidade com várias abstrações que definem linhas, arquivos, protocolos, mensagens, marcações, o que for.

Mas uma vez isso não era exatamente verdade. Caracteres de controle integrados dos aplicativos e processamento específico do dispositivo. Os sistemas de morte encefálica que exigiam CR e LF simplesmente não tinham abstração para separadores de registros ou terminadores de linha. O CR era necessário para que o teletipo ou a exibição de vídeo retornasse à coluna um e o LF (hoje, NL, mesmo código) era necessário para que ele avançasse para a próxima linha. Eu acho que a ideia de fazer algo diferente de descarregar os dados brutos no dispositivo era muito complexa.

Unix e Mac, na verdade, especificaram uma abstração para o final da linha, imagine isso. Infelizmente, eles especificaram diferentes. (Unix, ahem, veio primeiro.) E, naturalmente, eles usaram um código de controle que já estava "próximo" ao SOP

Como quase todo o nosso software operacional hoje é descendente do SW operacional do Unix, Mac ou MS, estamos presos à confusão de final de linha.

DigitalRoss
fonte
1

NL derivado de EBCDIC NL = x'15 ', que seria comparado logicamente com CRLF x'odoa ascii ... isso se torna evidente quando os dados são movidos fisicamente dos mainframes para os médios. Coloquialmente (como apenas pessoas arcanas usam ebcdic) NL foi equiparado a CR ou LF ou CRLF

david
fonte