Qual è la differenza tra \n
(newline) e \r
(ritorno a capo)?
In particolare, ci sono differenze pratiche tra \n
e \r
? Ci sono luoghi in cui uno dovrebbe essere usato invece dell'altro?
Qual è la differenza tra \n
(newline) e \r
(ritorno a capo)?
In particolare, ci sono differenze pratiche tra \n
e \r
? Ci sono luoghi in cui uno dovrebbe essere usato invece dell'altro?
Risposte:
In termini di codice ASCII, è 3 - dato che sono rispettivamente 10 e 13 ;-).
Ma sul serio, ci sono molti:
\n
è il codice di fine linea, \r
non significa niente di speciale\n
è la sequenza di escape standard per la fine della linea (tradotta in / da sequenze specifiche del sistema operativo secondo necessità)\r
era il codice per end-of-line\r\n
, in questo ordine\r\n
è la terminazione di linea standard per i formati di testo su Internet\r
comanda al carrello di tornare indietro a sinistra fino a quando non raggiunge l'arresto più a sinistra (un'operazione lenta), \n
comanda 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 .\r
e \n
agiscono 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 ;-).
\0
) dopo il \n
per consentire il extra tempo. Questo è stato gestito in modo trasparente dal sistema operativo in modo da non trovare alcuna traccia nel codice legacy.
\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é \n
o \r
sono visibili nel senso che, per esempio a
, .
, (
ecc caratteri sono.
Storicamente a \n
veniva usato per spostare il carrello verso il basso, mentre \r
per spostare il carrello sul lato sinistro della pagina.
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
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.
\r
non è stato il finale di linea su un Mac per molto tempo. Con il rilascio di Mac OS X nel 2001 (basato su Unix), \n
viene ora utilizzato.
\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 \r
terminazioni di riga.
Dal momento che nessun altro lo ha menzionato in modo specifico (sono troppo giovani per sapere / ricordare?) - Sospetto che sia stato usato \r\n
per 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.
Due personaggi diversi per diversi sistemi operativi. Anche questo ha un ruolo nei dati trasmessi su TCP/IP
cui è necessario l'utilizzo\r\n
.
\n
Unix
\r
Mac
\r\n
Windows e DOS.
Completare,
In uno script shell (bash), puoi usare \r
per inviare il cursore, in primo piano sulla linea e, ovviamente, \n
per posizionare il cursore su una nuova linea.
Ad esempio, prova:
echo -en "AA--AA" ; echo -en "BB" ; echo -en "\rBB"
AA--AA
AA--AABB
BB--AABB
Ma non dimenticare di usare -en
come parametri.
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.
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.
#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é?
Return
e Enter
. Perfino la mia moderna tastiera wireless mostra ancora la freccia giù e indietro sul vecchio Return
tasto (che ora è intitolato "Invio" per essere coerente con il tasto del tastierino numerico Enter
, che non mostra la freccia)
Qual è la differenza tra \ n (newline) e \ r (ritorno a capo)?
In particolare, ci sono differenze pratiche tra
\n
e\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 \n
per newline e \r
per 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 \n
viene sostituito da \r
alla 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 \r
a 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 \n
non necessariamente saltare all'inizio della seguente riga di testo. Su alcuni, in generale più vecchi, i sistemi operativi \n
possono essere il risultato del carattere newline, che salta ovunque nella riga seguente, non solo all'inizio. Questo è il motivo per cui è necessario utilizzare \r \n
per 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.