Lembrete - \ r \ n ou \ n \ r?


390

Eu simplesmente não consigo me lembrar disso. Então, qual é a maneira correta de finalizar corretamente as linhas ASCII à moda antiga?


11
Se você fizer isso, abra seus arquivos no modo binário . Caso contrário, os fluxos de arquivos C / C ++ padrão converterão o "\ n" (para arquivos de texto (o padrão)) em uma sequência de fim de linha específica da plataforma (ELS). Assim, "\ r \ n" no Windows será convertido em "\ r \ r \ n" no disco físico. Nota: se você apenas usar C / C ++ para ler o arquivo novamente, não notará que o ELS será convertido novamente em "\ n" quando lido do arquivo.
Martin York

@ Martin - Estou no .net, e estou usando (para este exemplo) File.AppendAllText, com "\ r \ n", e apenas dei uma olhada em um arquivo e não há duplicação no final de a linha. Magia?
Daniel Mošmondor

@ Daniel: Eu deveria ter sido mais específico. Os fluxos de C / C ++ . Quando associado a um arquivo e aberto no modo de texto . Também depende de como você olha o arquivo (use um hexeditor).
Martin York

@Martin - PSPad usado no modo hexadecimal ...
Daniel Mošmondor

11
Nos teclados antigos, a tecla Enter era chamada de tecla Return. Assim, o retorno foi o primeiro, o feed de linha foi gerado em resposta. É tudo tão óbvio quando você tem muita história.
Mark Ransom

Respostas:


1084

Eu usaria a palavra ' r etur n ' para lembrar, or vem antes do n.


116
E para lembrar que a palavra a ser usada é retorno , lembre-se de que \ r é o retorno de carro . Não se lembre de que "Retornar" é o nome da tecla nos teclados Mac, ou então você pode olhar para o teclado de um PC mais tarde, ver a tecla chamada "Enter" e errar a ordem das letras!
Rob Kennedy

3
@ David Mas eu queria saber o efeito de \n\re \r\né o mesmo, eles não fazem o mesmo efeito? você pode dizer a diferença?
precisa saber é o seguinte

7
@ Mr.Anubis, se você possui uma impressora matricial, não deve haver diferença, pois a ordem dos comandos não deve ser importante. No entanto, em algumas impressoras, você terá uma linha extra vazia ou nenhum avanço de linha. E tudo o que foi dito acima se aplica aos editores de texto - eles ficarão confusos, as classes TextStream ficarão doentes e assim por diante. A ordem é importante. :)
Daniel Mošmondor

12
@ DanielMošmondor Como alternativa, você pode se lembrar que a ordem é imporRtaNt. Ou que, quando você perguntou na SO, alguém lhe deu um RemiNder, que você mais tarde esqueceu. Ou que você não pode usar seu sobrenome como um lembrete, porque a ordem de r e n não é invertida :)
Daniel Daranas

5
@ RobKennedy haha, você sabe que eu vim aqui e li sobre o retorno, e achei "ótimo!". Então eu li o seu comentário. Agora, toda vez que eu não consigo lembrar para qual chave eu não deveria estar olhando - eu olho para a minha tecla "Enter" e acho que "algo está muito errado aqui" ... haha ​​pensando nisso!
Wayne Uroda

53

Se você estiver usando C #, deverá usar o Environment.NewLineque, de acordo com o MSDN, é:

Uma sequência contendo "\ r \ n" para plataformas não-Unix ou uma sequência contendo "\ n" para plataformas Unix.


46
Na verdade, esse tipo de dependência depende do que você está fazendo. Se você está apenas produzindo texto sem formatação no console ou em um arquivo para uso local, tudo Environment.NewLinebem. No entanto, se você estiver escrevendo coisas em um formato bem definido, o formato também poderá definir a nova linha. Por exemplo, o protocolo HTTP afirma que você deve usar \r\ncomo terminador de linha para cabeçalhos, etc, independentemente da plataforma.
Matti Virkkunen

3
Sim, este é um péssimo conselho.
IvanP

É por isso que você precisa escapar das mensagens da web e criar testes de unidade para verificar se o envio de \ r \ n (windows), \ r (mac) e \ n (linux) envia corretamente como \ r \ n para o servidor da web.
TamusJRoyce

37

A nova linha depende do seu sistema operacional:

DOS & Windows: \r\n 0D0A (hex), 13,10 (decimal)
Unix & Mac OS X: \n, 0A, 10
Macintosh (OS 9): \r, 0D, 13

Mais detalhes aqui: https://ccrma.stanford.edu/~craig/utility/flip/

Em caso de dúvida, use qualquer visualizador / editor hexadecimal de freeware para ver como um arquivo codifica sua nova linha.

Para mim, uso o seguinte guia para me lembrar: 0D0A = \ r \ n = CR, LF = ca rr iage r eturn, li n e feed


7
Estranhamente, sou uma dessas pessoas que sabe 0D0Ade cor, mas ainda confunde o \re \n.
Nyerguds

11
Ou, eu lembro que é retorno de carro e \ n é avanço de linha ... é só que eu não lembro da ordem deles, por isso não ajuda em lembrar qual é 0D e qual é 0A;)
Nyerguds

20

A sequência é CR (retorno de carro) - LF (avanço de linha). Lembra das impressoras matriciais? Exatamente. Então - a ordem correta é \ r \ n


Penso que esta é a resposta lógica mais
David Snabel-Caunt

12
LF + CR faria o mesmo CR + LF em impressoras.
Ikegami

10
Eu discordo, @ David. Apenas pensar em impressoras matriciais (ou máquinas de escrever, por falar nisso, já que são as que têm um carro para devolver) não é suficiente. Com apenas informações básicas sobre como eles funcionam, não há razão para pensar que importa se avançamos no artigo antes ou depois de retornar ao início da linha. Ambos \ r \ n e \ n \ r colocam o papel na mesma posição.
Rob Kennedy

@ikegami na maioria das impressoras, não em todas elas. Eles também tinham comutadores DIP para configurar esse comportamento. :)
Daniel Mošmondor

5
Uma razão para colocar a alimentação de linha após o retorno do carro é que reduz a quantidade total de tempo necessária - enquanto a cabeça está retornando à borda esquerda do papel, o cilindro pode indexar uma linha. A operação mais longa inicia primeiro, portanto, toda a operação é concluída no tempo que leva para ser executada. Fizemos muitas coisas por razões como essa naquela época; Imagine esperar um par de centenas de linhas de transmissão em 110 ...
Jerry Andrews

8

Em qualquer idioma .NET, Environment.NewLineseria preferível.


Não funciona para strings constantes. Quando necessário, melhor não usar constante e seqüência de uso estático em vez;)
TamusJRoyce

5

Tenha cuidado ao fazer isso manualmente.
Na verdade, eu recomendaria não fazer isso.

Na realidade, estamos falando sobre a sequência de terminação de linha LTS, específica da plataforma.

Se você abrir um arquivo no modo de texto (ou seja, não binário), os fluxos converterão o "\ n" no LTS correto para sua plataforma. Em seguida, converta o LTS novamente em "\ n" quando você ler o arquivo.

Como resultado, se você imprimir "\ r \ n" em um arquivo do Windows, obterá a sequência "\ r \ r \ n" no arquivo físico (consulte um editor hexadecimal).

Claro que isso é uma verdadeira dor quando se trata de transferir arquivos entre plataformas.

Agora, se você estiver gravando em um fluxo de rede, eu faria isso manualmente (como a maioria dos protocolos de rede chamam isso especificamente). Mas eu teria certeza de que o fluxo não está fazendo nenhuma interpretação (então o modo binário era apropriado).


4

\r\n para Windows funcionará perfeitamente.


Um single também \nfunciona bem no Windows, incluindo a versão mais recente do Notepad.
André Caron

Eu acho que os editores modernos detectarão finais de linha, pois diferentes sistemas operacionais usam finais diferentes.
David Snabel-Caunt

11
Na verdade, não: se você imprimir isso em um arquivo (arquivo C / C ++ padrão aberto no modo de texto) no Windows, o arquivo físico conterá "\ r \ r \ n" (verifique com um editor hexadecimal). Quando você lê novamente, "\ r \ n" é convertido novamente em um único "\ n".
Martin York

2
Na verdade, @DavidCaunt, eu apenas tentei \ n e não funciona com o bloco de notas no Win8.
philk

4

Da Wikipedia (você pode ler o que é correto para o seu sistema operacional nesse artigo):

Os sistemas baseados em ASCII ou em um conjunto de caracteres compatível usam LF (avanço de linha, '\ n', 0x0A, 10 em decimal) ou CR (retorno de carro, '\ r', 0x0D, 13 em decimal) individualmente ou CR seguido por LF (CR + LF, '\ r \ n', 0x0D0A).


3

\r\n

É estranho dizer que me lembro porque é o oposto da máquina de escrever que usei.
Bem, se fosse normal, não precisava me lembrar disso ...:-)

máquina de escrever da wikipedia * Imagem da Wikipedia

Na máquina de escrever, quando você termina de digitar a linha, usa a alavanca de retorno de carro , que antes faz rolar o tambor, a nova linha e depois permite operar manualmente o retorno de carro .

Você pode ouvir deste registro em freesound.org o som do papel sendo alimentado no início e em torno de -1: 03 segundos após o final, após o aviso da campainha para o final do som da linha do tambor que rola e depois o do retorno de carro.


2

se você estiver usando C #, por que não usar Environment.NewLine? (suponho que você use alguns objetos de gravador de arquivos ... apenas passe-o Environment.NewLinee ele manipulará os terminadores corretos.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.