Diferença entre \ n e \ r?

609

Qual é a diferença entre \n(nova linha) e \r(retorno de carro)?

Em particular, existem diferenças práticas entre \ne \r? Existem lugares onde um deve ser usado em vez do outro?

eozzy
fonte
3
Todas as respostas são razoavelmente previsíveis, mas eu estaria interessado em saber se existem diferenças PRÁTICAS entre \ n e \ r. Existem lugares onde um deve ser usado sobre o outro?
Vlad o Impala
9
bem, sim, os arquivos de texto com apenas LF (nova linha) não serão vistos como finalizados em alguns aplicativos do Windows, e os arquivos de texto finalizados com o CRLF parecerão ter caracteres extras se forem abertos em alguns aplicativos Linus.
pavium 19/11/09
2
sim, \ r é usado por alguns aplicativos de console linux para fazer animação de linha rotativa.
197 Murali
8
Ainda é realmente o EOL normal do Mac? Tenho certeza de que era para o Mac "clássico", mas pensei que o OS X tivesse Unixified. (Mostra como familiarizado estou com Macs, né?)
John Y
11
historicamente, um \ n era usado para mover o carro para baixo, enquanto o \ r era usado para mover o carro de volta para o lado esquerdo da página.
Karthik gorijavolu

Respostas:

827

Em termos de código ascii, é 3 - já que são 10 e 13, respectivamente ;-).

Mas, falando sério, existem muitos:

  • no Unix e em todos os sistemas semelhantes ao Unix, \né o código para final de linha, \rnão significa nada de especial
  • como conseqüência, em C e na maioria dos idiomas que de alguma forma a copiam (mesmo remotamente), \né a sequência de escape padrão para o final da linha (traduzida para / de sequências específicas do SO, conforme necessário)
  • em sistemas Mac antigos (pré-OS X), \rera o código para o final de linha
  • no Windows (e em muitos sistemas operacionais antigos), o código para final de linha é de 2 caracteres, \r\nnesta ordem
  • como uma conseqüência (surpreendente ;-) (voltando a sistemas operacionais muito mais antigos que o Windows), \r\né a terminação de linha padrão para formatos de texto na Internet
  • para "terminais" eletromecânicos do tipo teletipo, \rordena que o carro volte para a esquerda até atingir a parada mais à esquerda (uma operação lenta), \nordena que o rolo enrole uma linha (uma operação muito mais rápida) - é por isso que você sempre tem \r antes \n , para que o rolo possa se mover enquanto o carro ainda está indo para a esquerda! -) A Wikipedia tem uma explicação mais detalhada .
  • para os terminais de modo de caracteres (tipicamente aqueles que emulam impressão uniforme-idosas, como acima), no modo em bruto, \re \nactuam de modo semelhante (excepto tanto em termos do cursor, como não é nenhuma carro ou rolo ;-)

Na prática, no contexto moderno de gravação em um arquivo de texto, você deve sempre usar \n(o tempo de execução subjacente traduzirá isso se você estiver em um sistema operacional estranho, por exemplo, Windows ;-). A única razão para usar \ré se você estiver gravando em um terminal de caractere (ou, mais provavelmente, em uma "janela do console" emulando-o) e quiser que a próxima linha que você escreve substitua a última que você acabou de escrever (às vezes usada para animação ascii pateta) "efeitos de, por exemplo, barras de progresso) - isso está ficando bastante obsoleto em um mundo de GUIs ;-).

Alex Martelli
fonte
12
Para adicionar à história nesta resposta: como velocidades de linha aumentou de 10 caracteres por segundo, que levou mais de 2 caracteres no valor de tempo para o transporte de voltar e personagens inofensivos extra (normalmente NUL ie \0) foram adicionados após a \npermitir que o adicional Tempo. Isso foi tratado de forma transparente pelo sistema operacional, para que você não encontre nenhum vestígio no código legado.
Mark Ransom
11
Como o Windows é um sistema operacional "estranho"?
mailmindlin
31
@mailmindlin - você pergunta "Como o Windows é um sistema operacional 'estranho'?". Resposta: de mais maneiras do que eu posso contar facilmente (enquanto usava meias, os dedos dos pés não são permitidos :-). Todos os outros SOs sobreviventes são baseados em Unix ... O Windows é o único, sai de várias maneiras. Nesse contexto específico do Q - é o único que postula DOIS bytes (\ n \ r) como o fim de linha canônico ... por nenhuma razão sensata, exceto os históricos históricos explicados em outras partes do segmento ... todos os outros sistemas operacionais possui um único caractere a5 final de linha (99% + deles `\ n ').
Alex Martelli
1
@ nada é necessário: por exemplo, tools.ietf.org/html/rfc5322 , que substituiu o RFC 2822, definindo o formato das mensagens de email.
Keith Thompson
3
Um pequeno conselho a todos que escreverão um analisador de algum tipo em algum momento de suas vidas - nunca se esqueça de lidar adequadamente com o final das linhas. Eu tive uma experiência bastante desagradável com isso só porque me esqueci do \r(estou usando o Linux). Depois que comecei a analisar o que parecia ser um arquivo válido, meu analisador falhou porque o arquivo que eu estava analisando foi criado no Windows. : D O principal problema em tudo o que é que nenhum \n, ou \rsão visíveis no sentido de que, por exemplo a, ., (etc. caracteres são.
rbaleksandar
122

Historicamente, um \nfoi usado para mover o carro para baixo, enquanto o \rfoi usado para mover o carro de volta para o lado esquerdo da página.

tster
fonte
8
Talvez não seja uma resposta terrivelmente prática a uma pergunta de computador, mas o boato histórico recebe um voto positivo de qualquer maneira.
John Y
1
Imagine ser semelhante a quando você empurra a parte de digitação da sua máquina de digitação física para a esquerda, aka. Retorna.
Jo Smo
2
\ n não move o carro para baixo, ele gira o rolo para mover o papel para CIMA.
Roddy
5
Todo movimento é relativo. O papel é o meu mundo, e em relação a ele, o carro está se movendo para baixo: P
tster
2
FWIW, ainda pode ser um "retorno de carro" em sistemas modernos. Considere este código C printf("abcdefghijlm\rNOP\n");Compilado com o gcc-8 no OpenSuSe e execute em um terminal resulta nesta saída NOPdefghijlm. O \ r (retorno de carro) na string faz com que o cursor se mova para o início da linha (carro) e os caracteres após o \ r (ou seja, "NOP") sobrescrevem o que estava lá anteriormente (ou seja, o "abc")! Você pode obter um "movimento de carruagem" semelhante com backspace (\ b) como o printf("abcdefghijlm\b\bNOP\n");que produz #abcdefghijNOP
GMc 12/19/19
36

Dois personagens diferentes.

\n é usado como um terminador de fim de linha em arquivos de texto Unix

\r é usado como um terminador de fim de linha em arquivos de texto do Mac

\r\n (ou seja, ambos) são usados ​​para finalizar linhas nos arquivos de texto do Windows e do DOS.

pavium
fonte
2
Observe que existem / havia computadores que usavam \ n \ r como marcador de fim de linha quando você pressionou a tecla ENTER, como a Bolota e o RISC OS.
Anders
9
Para esclarecer: \rnão existe o final de linha em um Mac há muito tempo. Com o lançamento do Mac OS X em 2001 (que é baseado em Unix), \nagora é usado.
Jbbuckley
3
Mas ainda existem alguns aplicativos usando \r- por exemplo, MS Office 2011 Excel: salvando um CSV (com todas as configurações padrão) - salvará um arquivo codificado ISO-8859-1 com \rterminações de linha.
CodeBrauer
24

Como ninguém mais o mencionou especificamente (eles são jovens demais para saber / lembrar?) - Suspeito que o uso de \r\noriginou para máquinas de escrever e dispositivos similares.

Quando você queria uma nova linha enquanto usava uma máquina de escrever com capacidade para várias linhas, havia duas ações físicas a serem executadas: deslize o carro de volta ao início (à esquerda, nos EUA) da página e alimente o papel em um ponto .

Na época das impressoras de linha, a única maneira de fazer texto em negrito, por exemplo, era fazer um retorno de carro SEM uma nova linha e imprimir os mesmos caracteres sobre os antigos, adicionando mais tinta, fazendo com que parecesse mais escuro (em negrito) . Quando a função mecânica "nova linha" falhou em uma máquina de escrever, este foi o resultado irritante: você poderia digitar na linha de texto anterior se não estivesse prestando atenção.

nada é necessário
fonte
3
O padrão ASCII para nova linha é \ r \ n. (Além de um breve intervalo em que a Bell Telephone conseguiu o controle do comitê de padrões). Em troca do monopólio do telefone, a Bell Telephone desistiu do negócio de mensagens (telegrama, teletipo) e não se preocupou com o uso existente do padrão. HTTP, HTML, PCDOS e MSDOS usavam o padrão ASCII. A Bell Telephone optou por não ser padrão para o unix, porque eles não tinham negócios existentes para serem compatíveis.
david
12

Dois caracteres diferentes para diferentes sistemas operacionais. Além disso, isso desempenha um papel nos dados transmitidos sobre os TCP/IPquais requer o uso de\r\n .

\n Unix

\r Mac

\r\n Windows e DOS.

a432511
fonte
10
Eu acho que você está confuso com protocolos de aplicação, TCP / IP não tem idéia de \ n e \ r.
Jean-loup
4
O TCP / IP não requer o uso de \ r \ n. Vários protocolos baseados em Telnet exigem, incluindo SMTP, POP3, FTP, HTTP, ...
Marquês de Lorne
9

Completar,

Em um script shell (bash), você pode usar \rpara enviar o cursor, na frente da linha e, é claro, \npara colocar o cursor em uma nova linha.

Por exemplo, tente:

echo -en "AA--AA" ; echo -en "BB" ; echo -en "\rBB"
  • A primeira exibição "eco" AA--AA
  • O segundo : AA--AABB
  • O último : BB--AABB

Mas não se esqueça de usar -encomo parâmetros.

Akarun
fonte
5

Nas janelas, o \ n se move para o início da próxima linha. O \ r se move para o início da linha atual, sem passar para a próxima linha. Eu usei \ r em meus próprios aplicativos de console, onde estou testando algum código e não quero ver o texto rolando na tela, em vez de usar \ n depois de imprimir algum texto, por exemplo, uma taxa de quadros ( FPS), vou imprimirf ("% - 10d \ r", fps); Isso retornará o cursor para o início da linha sem passar para a próxima linha e me permitirá ter outras informações na tela que não são roladas enquanto a taxa de quadros é atualizada constantemente na mesma linha (a% -10 faz certo que a saída tem pelo menos 10 caracteres, deixada justificada para que ela seja preenchida por espaços, substituindo quaisquer valores antigos para essa linha). É bastante útil para coisas assim,

Um pouco de história

O / r significa "retorno" ou "retorno de carro", que deve sua história à máquina de escrever. Um retorno de carro moveu seu carro para a direita, para que você estivesse digitando no início da linha.

O / n significa "nova linha", novamente, dos dias da máquina de escrever que você mudou para uma nova linha. No entanto, não necessariamente no início, e é por isso que alguns sistemas operacionais adotaram a necessidade de retorno a / r seguido por uma nova linha / n, pois foi nessa ordem que a máquina de escrever o fez. Também explica os antigos computadores de 8 bits que usavam ter "Retorno" em vez de "Enter", de "retorno de carro", que era familiar.

Neil Roy
fonte
1

Apenas para aumentar a confusão, eu tenho trabalhado em um editor de texto simples usando um elemento TextArea em uma página HTML em um navegador. Antecipando problemas de compatibilidade com relação ao CR / LF, escrevi o código para verificar a plataforma e use a convenção de nova linha aplicável à plataforma.

No entanto, descobri algo interessante ao verificar os caracteres reais contidos na TextArea, por meio de uma pequena função JavaScript que gera os dados hexadecimais correspondentes aos caracteres.

Para o teste, digitei o seguinte texto:

Olá mundo [entrar]

Adeus, mundo cruel [entrar]

Quando examinei os dados do texto, a sequência de bytes que obtive foi a seguinte:

48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 0a 47 6f 6f 64 62 79 65 2c 20 43 72 75 65 6c 20 57 6f 72 6c 64 0a

Agora, a maioria das pessoas olhando para isso e vendo 0a, mas não 0d bytes, pensaria que essa saída foi obtida em uma plataforma Unix / Linux. Mas aqui está o problema: essa sequência eu obtive no Google Chrome no Windows 7 de 64 bits.

Portanto, se você estiver usando um elemento TextArea e examinando o texto, VERIFIQUE a saída como fiz acima, para garantir que bytes de caracteres reais são retornados de sua TextArea. Ainda estou para ver se isso difere em outras plataformas ou outros navegadores, mas vale a pena ter em mente se você estiver executando o processamento de texto via JavaScript e precisar tornar essa plataforma de processamento de texto independente.

As convenções abordadas nas postagens acima se aplicam à saída do console , mas os elementos HTML, ao que parece, aderem à convenção UNIX / Linux. A menos que alguém descubra o contrário em uma plataforma / navegador diferente.

David Edwards
fonte
0
#include <stdio.h>

void main()
{
  int countch=0;
  int countwd=1;

  printf("Enter your sentence in lowercase: ");
  char ch='a';
  while(ch!='\r')
  {
    ch=getche();
    if(ch==' ')
      countwd++;
    else
      countch++;
  }

  printf("\n Words = ",countwd);

  printf("Characters = ",countch-1);

  getch();

}

vamos dar este exemplo, tente colocar \ n no lugar de \ r não funcionará e tentar adivinhar por quê?

karthik gorijavolu
fonte
1
Isso só funciona se o SO subjacente enviar \ r \ n quando você pressionar a tecla ENTER, como MS DOS, DECS TOPS-10, CP / M, RT-11 etc. No SO: es como Multic, Unix e Unix ( Linux, Minix, etc) As teclas BeOS, RISCOS etc. ENTER enviam apenas um caractere \ n.
Anders
1
ahh sim, os bons velhos tempos em que os teclados costumavam ter ambos Returne Enter. Até o meu teclado sem fio moderno ainda mostra o baixo-e-seta para trás na velha Returntecla (que agora é intitulado "Enter" para ser coerente com o teclado numérico Enterchave, que não mostra a seta)
nothingisnecessary
0

Qual é a diferença entre \ n (nova linha) e \ r (retorno de carro)?

Em particular, existem diferenças práticas entre \ne \r? Existem lugares onde um deve ser usado em vez do outro?


Eu gostaria de fazer um breve experimento com as respectivas seqüências de escape de \nfor newline e \rde retorno de carro para ilustrar onde está a diferença distinta entre eles.

Eu sei que essa pergunta foi feita como independente de idioma. No entanto, precisamos de uma linguagem pelo menos para realizar o experimento. No meu caso, eu escolhi C ++, mas o experimento geralmente deve ser aplicado em qualquer linguagem de programação.

O programa simplesmente itera para imprimir uma frase no console, feita por uma iteração for-loop.


Programa de nova linha:

#include <iostream>

int main(void)
{
    for(int i = 0; i < 7; i++)
    {
       std::cout << i + 1  <<".Walkthrough of the for-loop \n";   // Notice `\n` at the end.
    }
    return 0;
}

Resultado:

1.Walkthrough of the for-loop
2.Walkthrough of the for-loop
3.Walkthrough of the for-loop
4.Walkthrough of the for-loop
5.Walkthrough of the for-loop
6.Walkthrough of the for-loop
7.Walkthrough of the for-loop

Observe que esse resultado não será fornecido em nenhum sistema; você está executando este código C ++. Mas deve funcionar para os sistemas mais modernos. Leia abaixo para mais detalhes.


Agora, o mesmo programa, mas com a diferença, que \né substituído por \rno final da sequência de impressão.

Programa de retorno de carro:

#include <iostream>

int main(void)
{
    for(int i = 0; i < 7; i++)
    {
       std::cout << i + 1  <<".Walkthrough of the for-loop \r";   // Notice `\r` at the end.
    }
    return 0;
}

Resultado:

7.Walkthrough of the for-loop 

Percebeu onde está a diferença? A diferença é simplesmente a seguinte: quando você usa a sequência de escape de retorno de carro \rno final de cada sequência de impressão, a próxima iteração dessa sequência não entra na seguinte linha de texto - No final de cada sequência de impressão, o cursor não saltou para o * início da próxima linha.

Em vez disso, o cursor retornou ao início da linha, na qual ele estava no final, antes de usar o \rcaractere. - O resultado é que cada iteração a seguir da sequência de impressão está substituindo a anterior.

* Nota: A \nnão necessariamente salta para o início da seguinte linha de texto. Em alguns sistemas, em geral mais antigos, o resultado do \ncaractere de nova linha pode ser que ele pula para qualquer lugar da linha seguinte, não apenas para o começo. É por isso que eles precisam usar \r \npara chegar ao início da próxima linha de texto.


Esse experimento nos mostrou a diferença entre nova linha e retorno de carro no contexto da saída da iteração de uma sequência de impressão.

Ao discutir sobre a entrada em um programa, alguns terminais / consoles podem converter um retorno de carro em uma nova linha implicitamente para melhor portabilidade, compatibilidade e integridade.

Mas se você tiver a opção de escolher um para outro ou desejar ou precisar usar explicitamente apenas um específico, você deve sempre operar com aquele que se adapte ao seu objetivo e faça uma distinção estrita entre eles.

RobertS suporta Monica Cellio
fonte