Differenza tra \ n e \ r?


609

Qual è la differenza tra \n(newline) e \r(ritorno a capo)?

In particolare, ci sono differenze pratiche tra \ne \r? Ci sono luoghi in cui uno dovrebbe essere usato invece dell'altro?


3
Tutte le risposte sono abbastanza prevedibili, ma sarei interessato a sapere se ci sono differenze PRATICHE tra \ n e \ r. Ci sono luoghi in cui uno dovrebbe essere usato sull'altro?
Vlad l'Impala,

9
bene, sì, i file di testo con solo LF (newline) non verranno visti come terminati in alcune applicazioni Windows e i file di testo terminati con CRLF sembreranno avere caratteri extra se aperti in alcune applicazioni Linus.
padiglione

2
sì, viene utilizzato da alcune app della console linux per eseguire l'animazione della linea rotante.
Murali,

8
È davvero ancora il normale Mac EOL? Sono sicuro che fosse per Mac "classico", ma avevo pensato che OS X avesse Unixified. (Mostra quanto ho familiarità con i Mac, eh?)
John Y,

11
storicamente a \ n veniva usato per spostare il carrello verso il basso, mentre \ r veniva usato per spostare il carrello sul lato sinistro della pagina.
karthik gorijavolu,

Risposte:


827

In termini di codice ASCII, è 3 - dato che sono rispettivamente 10 e 13 ;-).

Ma sul serio, ci sono molti:

  • in Unix e in tutti i sistemi simili a Unix, \nè il codice di fine linea, \rnon significa niente di speciale
  • di conseguenza, in C e nella maggior parte dei linguaggi che in qualche modo lo copiano (anche in remoto), \nè la sequenza di escape standard per la fine della linea (tradotta in / da sequenze specifiche del sistema operativo secondo necessità)
  • nei vecchi sistemi Mac (pre-OS X), invece, \rera il codice per end-of-line
  • in Windows (e molti vecchi sistemi operativi), il codice per la fine della riga è di 2 caratteri \r\n, in questo ordine
  • come conseguenza (sorprendente ;-) (che riconduce a sistemi operativi molto più vecchi di Windows), \r\nè la terminazione di linea standard per i formati di testo su Internet
  • per "terminali" simili a teletipi elettromeccanici, \rcomanda al carrello di tornare indietro a sinistra fino a quando non raggiunge l'arresto più a sinistra (un'operazione lenta), \ncomanda al rullo di arrotolare una linea (un'operazione molto più veloce) - questa è la ragione per cui hai sempre \r prima \n , in modo che il rullo possa muoversi mentre la carrozza sta ancora andando a sinistra! -) Wikipedia ha una spiegazione più dettagliata .
  • per i terminali in modalità carattere (in genere emulando quelli di stampa ancora più vecchi come sopra), in modalità raw, \re \nagiscono in modo simile (tranne che in termini di cursore, poiché non è presente carrello o rullo ;-)

In pratica, nel contesto moderno della scrittura su un file di testo, dovresti sempre usarlo \n(il runtime sottostante lo tradurrà se sei su un sistema operativo strano, ad esempio Windows ;-). L'unico motivo da usare \rè se stai scrivendo su un terminale di caratteri (o più probabilmente una "finestra della console" che lo emula) e vuoi che la riga successiva che scrivi sovrascriva l'ultima che hai appena scritto (a volte usata per la sciocca "animazione ascii" "effetti, ad esempio, delle barre di avanzamento) - questo sta diventando piuttosto obsoleto in un mondo di GUI, comunque ;-).


12
Per aggiungere alla cronologia in questa risposta: poiché la velocità della linea è aumentata da 10 caratteri al secondo, ci sono voluti più di 2 caratteri per il ritorno del carrello e sono stati aggiunti caratteri extra innocui (in genere NUL ie \0) dopo il \nper consentire il extra tempo. Questo è stato gestito in modo trasparente dal sistema operativo in modo da non trovare alcuna traccia nel codice legacy.
Mark Ransom,

11
In che modo Windows è un sistema operativo "strano"?
mailmindlin,

31
@mailmindlin - chiedi "In che modo Windows è un sistema operativo 'strano'?". Risposta: in molti modi diversi da quelli che posso facilmente contare (mentre indosso le calze, quindi le dita dei piedi non sono ammesse :-). Tutti gli altri SO sopravvissuti sono basati su Unix ... Windows è quello fuori, WAY fuori in molti modi. In questo specifico contesto di Q - è l'unico che pone DUE byte (\ n \ r) come fine della linea canonica ... per nessun motivo ragionevole tranne quelli storico-storici spiegati altrove sul thread ... ogni altro sistema operativo ha un solo carattere a5 line-end (99% + di loro `\ n ').
Alex Martelli,

1
@nothingisnecessary: ​​Ad esempio, tools.ietf.org/html/rfc5322 , che ha sostituito RFC 2822, definendo il formato dei messaggi di posta elettronica.
Keith Thompson,

3
Un piccolo consiglio a tutti coloro che scriveranno un parser di qualche tipo ad un certo punto della loro vita - non dimenticare mai di gestire correttamente la fine delle righe. Ho avuto una brutta esperienza con questo solo perché mi sono dimenticato del \r(sto usando Linux). Una volta che ho iniziato ad analizzare quello che sembrava essere un file valido, il mio parser non è riuscito perché il file che stavo analizzando è stato creato in Windows. : D Il problema principale di tutto ciò è che né \no \rsono visibili nel senso che, per esempio a, ., (ecc caratteri sono.
rbaleksandar,

122

Storicamente a \nveniva usato per spostare il carrello verso il basso, mentre \rper spostare il carrello sul lato sinistro della pagina.


8
Forse non è una risposta terribilmente pratica a una domanda al computer, ma la notizia storica ottiene comunque un mio voto.
John Y,

1
Immagina di essere simile a quando spingi la parte di battitura della tua macchina per scrivere fisica a sinistra aka. ritorno.
Jo Smo,

2
\ n non sposta il carrello verso il basso, ma ruota il rullo per spostare la carta verso l'alto.
Roddy,

5
Tutto il movimento è relativo. Il giornale è il mio mondo e, rispetto ad esso, la carrozza si sta spostando verso il basso: P
tster,

2
FWIW, può ancora essere un "Carriage Return" sui sistemi moderni. Considera questo codice C printf("abcdefghijlm\rNOP\n");Compilato con gcc-8 su OpenSuSe ed eseguito su un terminale risulta in questo output NOPdefghijlm. Il \ r (ritorno a capo) nella stringa provoca lo spostamento del cursore all'inizio della riga (carrello) e i caratteri che seguono il \ r (cioè "NOP") sovrascrivono ciò che era precedentemente lì (cioè "abc")! È possibile ottenere un simile "movimento della carrozza" con il backspace (\ b) come in quello printf("abcdefghijlm\b\bNOP\n");che produceabcdefghijNOP
GMc

36

Due personaggi diversi.

\n viene utilizzato come terminatore di fine riga nei file di testo Unix

\r viene utilizzato come terminatore di fine riga nei file di testo Mac

\r\n (ovvero entrambi) vengono utilizzati per terminare le righe nei file di testo Windows e DOS.


2
Si noti che ci sono / erano computer che utilizzavano \ n \ r come marker di fine riga quando si premeva il tasto INVIO, come Acorn e sistema operativo RISC.
Anders,

9
Per chiarire: \rnon è stato il finale di linea su un Mac per molto tempo. Con il rilascio di Mac OS X nel 2001 (basato su Unix), \nviene ora utilizzato.
Jbbuckley,

3
Ma ci sono ancora alcune applicazioni che usano \r- ad esempio MS Office 2011 Excel: salvataggio di un file CSV (con tutte le impostazioni predefinite) - salverà un file codificato ISO-8859-1 con \rterminazioni di riga.
CodeBrauer,

24

Dal momento che nessun altro lo ha menzionato in modo specifico (sono troppo giovani per sapere / ricordare?) - Sospetto che sia stato usato \r\nper macchine da scrivere e dispositivi simili.

Quando si voleva una nuova linea mentre si utilizzava una macchina da scrivere con funzionalità multilinea, c'erano due azioni fisiche che doveva eseguire: far scorrere il carrello indietro all'inizio (a sinistra, negli Stati Uniti) della pagina e alimentare la carta di una tacca .

Ai tempi delle stampanti a riga, l'unico modo per scrivere in grassetto, ad esempio, era fare un ritorno a capo SENZA una nuova riga e stampare gli stessi caratteri su quelli vecchi, aggiungendo così più inchiostro e facendolo apparire più scuro (in grassetto) . Quando la funzione "newline" meccanica non funzionava in una macchina da scrivere, questo era il risultato fastidioso: si poteva digitare sulla riga di testo precedente se non si prestava attenzione.


3
Lo standard ASCII per newline è \ r \ n. (A parte un breve intervallo in cui Bell Telephone ha ottenuto il controllo del comitato degli standard). In cambio del monopolio telefonico, Bell Telephone ha rinunciato all'attività di messaggistica (telegramma, teletipo) e non si è preoccupato dell'uso esistente dello standard. HTTP, HTML, PCDOS e MSDOS utilizzavano lo standard ASCII. Bell Telephone ha scelto di diventare non standard per Unix perché non aveva attività commerciali con cui essere compatibili.
David,

12

Due personaggi diversi per diversi sistemi operativi. Anche questo ha un ruolo nei dati trasmessi su TCP/IPcui è necessario l'utilizzo\r\n .

\n Unix

\r Mac

\r\n Windows e DOS.


10
Penso che tu stia confondendo con i protocolli applicativi, TCP / IP non ha idea di \ n e \ r.
jean-loup,

4
TCP / IP non richiede l'uso di \ r \ n. Vari protocolli basati su Telnet lo richiedono, tra cui SMTP, POP3, FTP, HTTP, ...
Marchese di Lorne

9

Completare,

In uno script shell (bash), puoi usare \rper inviare il cursore, in primo piano sulla linea e, ovviamente, \nper posizionare il cursore su una nuova linea.

Ad esempio, prova:

echo -en "AA--AA" ; echo -en "BB" ; echo -en "\rBB"
  • Il primo display "echo" AA--AA
  • Il secondo : AA--AABB
  • L'ultimo : BB--AABB

Ma non dimenticare di usare -encome parametri.


5

In Windows, \ n si sposta all'inizio della riga successiva. Il \ r si sposta all'inizio della riga corrente, senza passare alla riga successiva. Ho usato \ r nelle mie app di console in cui sto testando un po 'di codice e non voglio vedere il testo scorrere sullo schermo, quindi piuttosto che usare \ n dopo aver stampato del testo, per esempio, un frame rate ( FPS), stamperò f ("% - 10d \ r", fps); Questo restituirà il cursore all'inizio della riga senza spostarsi sulla riga successiva e mi consentirà di avere sullo schermo altre informazioni che non vengono sfogliate mentre il framerate si aggiorna costantemente sulla stessa riga (% -10 rende certo che l'output è di almeno 10 caratteri, lasciato giustificato in modo da finire riempito da spazi, sovrascrivendo tutti i vecchi valori per quella riga). È abbastanza utile per cose come questa,

Un po 'di storia

Il / r sta per "ritorno" o "ritorno a capo" che deve la sua storia alla macchina da scrivere. Un ritorno a capo ha spostato il carrello completamente a destra in modo da digitare all'inizio della riga.

Il / n sta per "nuova linea", ancora una volta, dai giorni della macchina da scrivere si è passati a una nuova linea. Tuttavia, non inizialmente all'inizio, motivo per cui alcuni sistemi operativi hanno adottato la necessità sia di un ritorno a / r seguito da una nuova riga, poiché quello era l'ordine in cui una macchina da scrivere lo faceva. Spiega anche i vecchi computer a 8 bit che usavano avere "Ritorno" anziché "Invio", da "ritorno a capo", che era familiare.


1

Giusto per aggiungere confusione, ho lavorato su un semplice editor di testo usando un elemento TextArea in una pagina HTML in un browser. In previsione dei problemi di compatibilità rispetto a CR / LF, ho scritto il codice per controllare la piattaforma e utilizzare qualsiasi convenzione newline applicabile alla piattaforma.

Tuttavia, ho scoperto qualcosa di interessante durante il controllo dei caratteri effettivi contenuti in TextArea, tramite una piccola funzione JavaScript che genera i dati esadecimali corrispondenti ai caratteri.

Per il test, ho digitato il seguente testo:

Ciao, mondo [invio]

Addio, mondo crudele [invio]

Quando ho esaminato i dati di testo, la sequenza di byte che ho ottenuto era questa:

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

Ora, la maggior parte delle persone guarda questo, e vede 0a ma non 0d byte, pensa che questo output sia stato ottenuto su una piattaforma Unix / Linux. Ma ecco il problema: questa sequenza che ho ottenuto in Google Chrome su Windows 7 a 64 bit.

Quindi, se stai usando un elemento TextArea e stai esaminando il testo, CONTROLLA l'output come ho fatto sopra, per assicurarti quali byte di caratteri effettivi vengono restituiti da TextArea. Devo ancora vedere se questo differisce su altre piattaforme o altri browser, ma vale la pena tenere a mente se stai eseguendo l'elaborazione del testo tramite JavaScript e devi rendere indipendente quella piattaforma di elaborazione del testo.

Le convenzioni trattate nei post precedenti si applicano all'output della console , ma sembra che gli elementi HTML aderiscano alla convenzione UNIX / Linux. A meno che qualcuno non scopra diversamente su un'altra piattaforma / browser.


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();

}

facciamo questo esempio prova a mettere \ n al posto di non funzionerà e prova a indovinare il perché?


1
Funziona solo se il tuo sistema operativo sottolineato invia \ r \ n quando premi il tasto INVIO, come MS DOS, DECS TOPS-10, CP / M, RT-11 ecc. In OS: come Multic, Unix e Unix-like ( Linux, Minix ecc.) BeOS, RISCOS ecc. Il tasto INVIO ti invia solo un carattere \ n.
Anders,

1
ah sì, i bei vecchi tempi in cui le tastiere avevano entrambi Returne Enter. Perfino la mia moderna tastiera wireless mostra ancora la freccia giù e indietro sul vecchio Returntasto (che ora è intitolato "Invio" per essere coerente con il tasto del tastierino numerico Enter, che non mostra la freccia)
niente è necessario il

0

Qual è la differenza tra \ n (newline) e \ r (ritorno a capo)?

In particolare, ci sono differenze pratiche tra \ne \r? Ci sono luoghi in cui uno dovrebbe essere usato invece dell'altro?


Vorrei fare un breve esperimento con le rispettive sequenze di escape di \nper newline e \rper il ritorno a capo per illustrare dove si trova la differenza netta tra di loro.

So che questa domanda è stata posta come indipendente dalla lingua. Tuttavia, abbiamo bisogno di un linguaggio almeno per completare l'esperimento. Nel mio caso, ho scelto C ++, ma l'esperimento sarà generalmente applicabile in qualsiasi linguaggio di programmazione.

Il programma semplicemente esegue l'iterazione per stampare una frase nella console, eseguita da un'iterazione for-loop.


Programma Newline:

#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;
}

Produzione:

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

Si noti che questo risultato non verrà fornito su nessun sistema, si sta eseguendo questo codice C ++. Ma funzionerà per i sistemi più moderni. Leggere sotto per ulteriori dettagli.


Ora, lo stesso programma, ma con la differenza, che \nviene sostituito da \ralla fine della sequenza di stampa.

Programma di restituzione del trasporto:

#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;
}

Produzione:

7.Walkthrough of the for-loop 

Hai notato dove è la differenza? La differenza è semplicemente che, quando si utilizza la sequenza di escape Ritorno \ra capo carrello alla fine di ciascuna sequenza di stampa, la successiva iterazione di questa sequenza non entra nella seguente riga di testo: alla fine di ogni sequenza di stampa, il cursore non ha saltato all'inizio * della riga successiva.

Invece, il cursore è tornato all'inizio della riga, su cui si trovava alla fine di, prima di usare il \r personaggio. - Il risultato è che ogni successiva iterazione della sequenza di stampa sostituisce la precedente.

* Nota: A \nnon necessariamente saltare all'inizio della seguente riga di testo. Su alcuni, in generale più vecchi, i sistemi operativi \npossono essere il risultato del carattere newline, che salta ovunque nella riga seguente, non solo all'inizio. Questo è il motivo per cui è necessario utilizzare \r \nper ottenere all'inizio della riga di testo successiva.


Questo esperimento ci ha mostrato la differenza tra ritorno a capo e ritorno a capo nel contesto dell'output dell'iterazione di una sequenza di stampa.

Quando discutiamo dell'input in un programma, alcuni terminali / console possono convertire implicitamente un ritorno a capo in una nuova riga per una migliore portabilità, compatibilità e integrità.

Ma se hai la scelta di sceglierne uno per l'altro o vuoi o devi usare esplicitamente solo uno specifico, dovresti sempre operare con quello che si adatta al suo scopo e distinguere rigorosamente tra.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.