Como \ n e \ r são tratados de maneira diferente no Linux e Windows?

22

Eu acho que \nmove a agulha para baixo e \rmove a agulha para o início de uma linha (alinhar à esquerda)? Eu não tenho certeza, no entanto. Então, se eu estiver errado, por favor me corrija ....

De qualquer forma, me foi dito que o Windows e Linux punho newlinese carriage returnsdiferente. Gostaria de saber como eles lidam com eles de maneira diferente e em alguns lugares onde é importante lembrar. Obrigado por responder.

千里 ち ゃ
fonte
Até agora eu sei que \r\nestá tudo bem no Windows, mas \n\rnão está, e me lembro disso porque \r\né um acrônimo para enfermeira registrada. Também ouvi dizer que \né isso que as pessoas usam no Linux e \rnão são usadas sozinhas para o mesmo propósito que \r\n. \ré usado no MacOS realmente antigo. Eu não verifiquei esses fatos, no entanto.
千里ちゃん
4
Não ligue para eles \re \n, como o \ntratamento é feito depende de onde você o está usando. Melhor chamá-los CRe LF.
Ignacio Vazquez-Abrams
Ignacio, essas siglas não têm significado para mim. Como você chama isso :/? OH ... ALIMENTAÇÃO DE LINHA e RETORNO DE CARRO. Obrigado, sleske.
千里ちゃん
@ IgnacioVazquez-Abrams \ \ não é idêntico ao LF? Em qualquer gráfico ASCII, o caractere 13 = \ n = LF?
barlop
11
@ Barlop: Não está em C ao imprimir no Windows.
Ignacio Vazquez-Abrams

Respostas:

21

Eu acho que \ n move a agulha para baixo e \ r move a agulha para o início de uma linha (alinhar à esquerda)? Eu não tenho certeza, no entanto

Isso é verdade, mais ou menos, mas principalmente uma curiosidade histórica. Originalmente, o avanço de linha (LF) era usado para avançar o papel por uma linha em impressoras e terminais de cópia impressa ( tele- impressoras ); retorno de carro (CR) retornou a cabeça de impressão para o início da linha.

Provavelmente isso ainda funciona em impressoras modernas quando usado no "modo de texto", mas é pouco relevante hoje em dia.

De qualquer forma, me disseram que o Windows e o Linux lidam com novas linhas e retornos de carro de maneira diferente.

A diferença é simples: os designers de sistemas operacionais tiveram que escolher como representar o início de uma nova linha no texto em arquivos de computador. Por várias razões históricas, no mundo Unix / Linux, um único caractere LF foi escolhido como marcador de nova linha; O MS-DOS escolheu CR + LF e o Windows herdou isso. Assim, plataformas diferentes usam convenções diferentes.

Na prática, isso está se tornando cada vez menos um problema. O marcador de nova linha é realmente relevante apenas para os pogramas que processam "texto sem formatação", e não há muitos - afeta principalmente o código-fonte do programa, os arquivos de configuração e alguns arquivos de texto simples com documentação. Atualmente, a maioria dos programas que lidam com esse tipo de arquivo (editores, compiladores, etc.) pode lidar com ambas as convenções de nova linha, portanto, não importa qual você escolher.

Existem alguns casos em que as ferramentas insistem na convenção de nova linha "deles" (por exemplo, os scripts de shell do Unix não devem usar CR + LF); nesse caso, você deve usar o correto.

sleske
fonte
Mesma linha de questionamento: as linguagens de programação reconhecem \n\re \nsão iguais? Por exemplo, se eu estivesse analisando um arquivo de texto que foi editado no PC de outra pessoa e continha a versão das quebras de linha do Linux e do Windows, executar um preg_matchfor \ne \n\rme fornecer resultados diferentes?
千里ちゃん
@ 千里 ち ゃ ん: Isso depende totalmente da linguagem de programação, compilador etc. Em particular, se você usar regexes, isso dependerá do mecanismo de regex que você usa - alguns distinguem diferentes terminações de linha, outros não (a maioria pode ser configurada de qualquer maneira, Acredito).
sleske
@ 千里 ち ゃ ん: Se você tiver alguma dúvida sobre como algum sistema / linguagem de programação / mecanismo de expressão regular lida com diferentes convenções de nova linha, faça isso como uma pergunta separada.
sleske
você deve estar escrevendo \ r \ n não da maneira errada como está. Quanto às linguagens de programação, eles poderiam ler caracteres individuais e você, o programador, pode ver qual é usado na entrada, e o programador também pode fazer o que deseja para a saída. Assim como você pode dizer "Escreva ABC seguido de \ r \ r \ r \ n", quaisquer caracteres que você queira colocar no final! alguns outros caracteres podem não ser imprimíveis e não gráficos ou o que for. Eles podem ter algumas funções incorporadas, como println, e o que eles usam para sua nova linha seria uma ou outra, não podem ser as duas.
barlop
@ 千里 ち ゃ ん e algumas linguagens de programação podem permitir que você escolha qual final final como uma configuração em uma de suas funções internas, então mesmo em uma função interna você poderia .. em teoria de qualquer maneira. + como mencionado, na prática, você pode escrever qualquer final de linha que desejar ... embora você não consiga fazê-lo com eficiência, como com uma função println.
barlop
14

CR e LF

O Código Padrão Americano para Intercâmbio de Informações (ASCII) definiu caracteres de controle, incluindo CARRIAGE-RETURN (CR) e LINE-FEED (LF) que foram (e ainda são) utilizados para controlar a posição de impressão nas impressoras de maneira análoga à máquinas de escrever mecânicas que precederam as primeiras impressoras de computador.

Dependência de plataforma

No Windows, o separador de linhas tradicional em arquivos de texto é CR seguido por LF

Nos sistemas Apple Macintosh antigos (pré-OSX), o separador de linha tradicional em arquivos de texto era CR

No Unix e Linux, o separador de linhas tradicional em arquivos de texto é LF.

\ n e \ r

Em muitas linguagens de programação e script \nsignifica "nova linha". Às vezes (mas nem sempre), isso significa o caractere ASCII LINE-FEED (LF), que, como você diz, move o cursor (ou posição de impressão) uma linha. Em uma impressora ou máquina de escrever, isso realmente moveria o papel uma linha acima.

Invariavelmente, \rsignifica o caractere ASCII DE RETORNO DE CARRO (CR), cujo nome realmente vem de máquinas de escrever mecânicas, onde havia uma chave de retorno de carro que fazia com que o rolo ("carro") que carregava o papel se movesse para a direita, movido por uma mola, na medida do possível. Definindo assim a posição atual de digitação na margem esquerda.

Programação

Em algumas linguagens de programação, \npode significar uma sequência de caracteres dependente da plataforma que termina ou separa linhas em um arquivo de texto. Por exemplo, no Perl, print "\n"produz uma sequência de caracteres diferente no Linux e no Windows.

Em Java, a melhor prática, se você quiser usar os fins de linha nativos para a plataforma de tempo de execução, não é para uso \nou \rem tudo. Você deveria usar System.getProperty("line.separator"). Você deve usar \ne \ronde deseja LF e CR, independentemente da plataforma (por exemplo, como usado em HTTP, FTP e outros protocolos de comunicação da Internet).

Unix stty

Em um shell Unix, o sttycomando pode ser usado para fazer com que o shell seja convertido entre essas várias convenções. Por exemplo, stty -onlcrfará com que o shell traduza posteriormente todos os LFs de saída para CR LF.

Linux e OSX seguem convenções Unix

Arquivos de texto

Os arquivos de texto ainda são extremamente importantes e amplamente utilizados. Por exemplo, HTML e XML são exemplos de arquivo de texto. A maioria dos protocolos importantes da Internet, como HTTP, segue convenções de arquivos de texto e inclui especificações para terminações de linha.

Impressoras

A maioria das impressoras, além das mais baratas, ainda respeita a CR e a LF. De fato, são fundamentais para as linguagens de descrição de página mais usadas - PCL e Postscript.

RedGrittyBrick
fonte
11
Nota sobre Java: geralmente não é verdade que você "não use \ n ou \ r". É apenas que em Java, "\ n" é sempre LF e "\ r" é sempre CR. Isso pode ser apenas o que você quer: Se você quiser uma linha específica terminando estilo, usá-los; se você quiser explicitamente a linha nativa de encerramento do computador que você está executando, em seguida, usar line.separator. Realmente depende do que você quer.
sleske
E BTW, println()usa automaticamente line.separator; portanto, se você quiser finais de linha nativos, poderá usar println()(e se precisar de um determinado tipo específico de final de linha, não o use, mas use "\ n" etc. explicitamente).
sleske
@sleske: Bons pontos. Vou atualizar minha resposta de acordo.
precisa saber é o seguinte
11
Existem idiomas ou compiladores onde \nexiste um caractere de controle que não seja o ASCII LF (que não seja o sistema EBCDIC)? Estou me referindo ao que \nsignifica uma literal de seqüência de caracteres ou caracteres, e não ao efeito de enviá-lo para um arquivo ou dispositivo de saída.
perfil completo de Keith Thompson
11
@KeithThompson: Para Java: Sim, \nsempre é o código 10 ASCII (e Unicode), porque o JLS diz isso explicitamente (JLS 3.10.6, "Sequências de escape para caracteres e literais de cadeias" - verifiquei :-)). Para outras línguas - boa pergunta.
sleske
4

Em resumo, era necessário para impressoras, mas agora os sistemas operacionais fazem isso de maneira um pouco diferente. Na maioria dos casos, não há problema em apenas fazer CR e LF fazendo \r\ne, na maioria dos casos, isso funcionará bem.

James Billingham
fonte
O Linux simplesmente ignora \rou causa algum tipo de mudança de comportamento?
Aaron Franke