Differenza tra i tipi di interruzione di linea CR LF, LF e CR?


759

Vorrei sapere la differenza (con esempi se possibile) tra i tipi di interruzione di riga CR LF (Windows), LF (Unix) e CR (Macintosh).


9
Molto simile, ma non un duplicato esatto . \nè in genere rappresentato da un avanzamento riga, ma non è necessariamente un avanzamento riga.
Adrian McCarthy

92
CR e LF sono ASCII e caratteri di controllo Unicode mentre \re \nsono astrazioni utilizzati in alcuni linguaggi di programmazione. La chiusura di questa domanda copre le differenze fondamentali tra le domande e perpetua la disinformazione.
Adrian McCarthy,

5
@AdrianMcCarthy È un problema il modo in cui i voti stretti fungono da risposte in un certo senso; una risposta sostenendo che i due erano uguali potrebbe essere annullata e quindi oscurata come molto, molto sbagliata, ma ci vogliono solo 4 voti concordanti (paragonabili a voti) per avere una chiusura molto sbagliata, senza modo di contrastare il voto fino a dopo è successo.
Jon Hanna,

Questa formulazione della domanda è certamente migliore, ma è ancora per tutti gli scopi pratici la stessa domanda.
Jukka K. Korpela,

6
@ JukkaK.Korpela: No, in realtà non lo è. \nnon significa la stessa cosa in tutti i linguaggi di programmazione.
Adrian McCarthy,

Risposte:


349

In realtà si tratta solo di quali byte sono memorizzati in un file. CRè un bytecode per il ritorno a capo (dai giorni delle macchine da scrivere) e LF, allo stesso modo, per l'alimentazione di riga. Si riferisce solo ai byte che vengono posizionati come marker di fine riga.

Molto più informazioni, come sempre, su Wikipedia .


53
Penso che sia anche utile menzionare che CRè il personaggio di fuga \red LFè il personaggio di fuga \n. Inoltre, Wikipedia: Newline .
Robert Vunabandi,

1
In parole semplici CR and LFè solo fine riga e nuova riga in base a questo link , è corretto?
Shaijut,

@shaijut CR sta per Carriage Return. Questo è ciò che ha restituito il trasporto su macchine da scrivere. Quindi, per lo più corretto.
AliFurkan

763

CR e LF sono caratteri di controllo, rispettivamente codificati 0x0D(13 decimali) e 0x0A(10 decimali).

Sono utilizzati per contrassegnare un'interruzione di riga in un file di testo. Come hai indicato, Windows utilizza due caratteri nella sequenza CR LF; Unix utilizza solo LF e il vecchio MacOS (pre-OSX MacIntosh) utilizzava CR.

Una prospettiva storica apocrifa:

Come indicato da Peter , CR = Carriage Return e LF = Line Feed , due espressioni hanno le loro radici nelle vecchie macchine da scrivere / TTY. LF spostò la carta verso l'alto (ma mantenne la posizione orizzontale identica) e CR riportò il "carrello" in modo che il carattere successivo digitato fosse nella posizione più a sinistra sulla carta (ma sulla stessa linea). CR + LF stava facendo entrambe le cose, ovvero preparandosi a scrivere una nuova linea. Con il passare del tempo la semantica fisica dei codici non era applicabile e poiché lo spazio di memoria e floppy disk era un premio, alcuni progettisti di sistemi operativi decisero di usare solo uno dei personaggi, ma non comunicarono molto bene tra loro; -)

La maggior parte dei moderni editor di testo e applicazioni orientate al testo offrono opzioni / impostazioni, ecc. Che consentono il rilevamento automatico della convenzione di fine riga del file e la visualizzazione di conseguenza.


11
quindi in realtà Windows è l'unico sistema operativo che utilizza correttamente questi caratteri, Ritorno a capo, seguito da un avanzamento riga.
Rolf,

4
Sarebbe quindi preciso dire che un file di testo creato su Windows è il più compatibile dei tre, ovvero il più probabile da visualizzare su tutti e tre i sottoinsiemi del sistema operativo?
Prometeo

3
@Hashim potrebbe essere visualizzato correttamente, ma il tentativo di eseguire uno script di shell testuale con ritorni a capo di solito si tradurrà in un errore
Omer

In parole semplici CR and LFè solo fine riga e nuova riga in base a questo link , è corretto?
Shaijut,

Ho scoperto che alcuni file in stile Windows ( CR+LF) possono essere visualizzati con doubleline su altri sistemi. Presumibilmente l'editor che visualizza il testo supporta sia Ritorno a capo che Avanzamento di riga come delimitatori di nuova riga e come tale può creare 2 righe dove 1 era previsto. Quindi, sebbene CR+LFpossa essere il più compatibile, non penso che sia senza problemi.
Magnus Bull,

459

Questo è un buon riassunto che ho trovato:

Il carattere Ritorno a capo (CR) ( 0x0D, \r) sposta il cursore all'inizio della riga senza avanzare alla riga successiva. Questo personaggio viene utilizzato come nuovo carattere di linea nei sistemi operativi Commodore e Early Macintosh (OS-9 e precedenti).

Il carattere di avanzamento riga (LF) ( 0x0A, \n) sposta il cursore verso il basso sulla riga successiva senza tornare all'inizio della riga. Questo carattere viene utilizzato come nuovo carattere di linea nei sistemi basati su UNIX (Linux, Mac OSX, ecc.)

La sequenza End of Line (EOL) ( 0x0D 0x0A, \r\n) è in realtà due caratteri ASCII, una combinazione dei caratteri CR e LF. Sposta il cursore verso il basso sulla riga successiva e all'inizio di quella riga. Questo carattere viene utilizzato come nuovo carattere di linea nella maggior parte degli altri sistemi operativi non Unix, inclusi Microsoft Windows, Symbian OS e altri.

fonte


1
Il carattere "scheda verticale" sposta il cursore verso il basso e mantiene la posizione nella linea, non il carattere LF. LF è EOL.
12431234123412341234123

2
@TaylorLeese / r / n e / n / r sono uguali?
Vicrobot,

175

Dal momento che non esiste una risposta affermando proprio questo, sinteticamente sintetizzato:

Ritorno a capo (pre-OSX MAC)

  • CR
  • \ r
  • Codice ASCII 13

Line Feed (Linux, MAC OSX)

  • LF
  • \ n
  • Codice ASCII 10

Ritorno a capo e avanzamento riga (Windows)

  • CRLF
  • \ R \ n
  • Codice ASCII 13 e quindi codice ASCII 10

Se vedi il codice ASCII in uno strano formato, sono semplicemente i numeri 13 e 10 in una diversa radice / base, di solito base 8 (ottale) o base 16 (esadecimale).

http://www.bluesock.org/~willg/dev/ascii.html


46

Jeff Atwood ha pubblicato un recente post su questo argomento : The Great Newline Schism

Ecco l'essenza di Wikipedia :

La sequenza CR + LF era di uso comune su molti primi sistemi di computer che avevano adottato macchine teletype, in genere un ASR33, come dispositivo console, poiché questa sequenza era necessaria per posizionare tali stampanti all'inizio di una nuova linea. Su questi sistemi, il testo era spesso composto regolarmente per essere compatibile con queste stampanti, poiché il concetto di driver di dispositivo che nascondeva tali dettagli hardware dall'applicazione non era ancora ben sviluppato; le applicazioni dovevano parlare direttamente con la macchina del teletipo e seguire le sue convenzioni.La separazione delle due funzioni nascondeva il fatto che la testina di stampa non poteva tornare dall'estrema destra all'inizio della riga successiva in un tempo di un carattere. Questo è il motivo per cui la sequenza è sempre stata inviata prima con CR. In effetti, spesso era necessario inviare caratteri extra (CR o NUL estranei, che vengono ignorati) per dare alla testina di stampa il tempo di spostarsi sul margine sinistro. Anche dopo che i teletipi sono stati sostituiti da terminali di computer con baud rate più elevati, molti sistemi operativi supportano comunque l'invio automatico di questi caratteri di riempimento, per la compatibilità con terminali più economici che richiedono tempi di caratteri multipli per scorrere il display.


5
+1 È per questa semplice comprensione che ricordo sempre in quale ordine arriva la combinazione. Ancora oggi possiamo ancora vedere questa logica meccanica in qualsiasi stampante a getto d'inchiostro (amo capire poiché odio imparare). I miei altri trucchi di memoria sono: "mac? Return to mittente" e "NewLineFeed" (per ricordare che NL === LF e per ricordare il \ n, poiché CR ha già la R nella sua sigla)
GitaarLAB

3
"Sono dubbioso ... per il cronometraggio erano necessari due codici di controllo". Non è quello che dice. Dice che i CR e gli NUL extra sono qui per dare il tempo di tornare, non l'originale CR LF.
Julien Rousseau,

11
@Adrian Farai l'esperienza della persona? 1) Ai miei vecchi tempi di teletipo, la stampante che usavamo era necessaria <CR><CR><LF>, quindi ovviamente ne ho sperimentato solo uno <CR>. Ho inviato <CR><LF>Adopo una lunga fila, e si sentiva l' Aessere stampato prima che il carrello tornasse completamente.
John Burger,

11
@Adrian 2) Non dimenticare, questo era nell'era elettromeccanica, dove ogni personaggio svolgeva esattamente una funzione. Spesso abbiamo enfatizzato una parola stampando la linea, quindi inviando <CR><CR>e digitando il numero corretto di spazi, quindi ristampando la stessa parola: una forma primitiva di grassetto.
John Burger,

3
@Adrian 3) E infine, utilizzava Baudot (o codice Murray), non ASCII. Cinque bit di dati, tra un bit di avvio e un bit di stop e mezzo. Come puoi averne mezzo mezzo? Attendendo mezzo tempo prima di iniziare a inviare il personaggio successivo, per dare alla testina di stampa il tempo di tornare al centro.
John Burger,

16

CR - Codice ASCII 13

LF - Codice ASCII 10.

Teoricamente CR riporta il cursore nella prima posizione (a sinistra). LF alimenta una riga spostando il cursore di una riga in basso. Ecco come ai vecchi tempi controllavi stampanti e monitor in modalità testo. Questi caratteri vengono generalmente utilizzati per contrassegnare la fine delle linee nei file di testo. Diversi sistemi operativi utilizzavano convenzioni diverse. Come hai sottolineato Windows utilizza la combinazione CR / LF mentre i Mac pre-OSX usano solo CR e così via.


7

I sistemi basati su ASCII o un set di caratteri compatibili utilizzano LF (avanzamento riga, 0x0A, 10 in decimale) o CR (ritorno a capo, 0x0D, 13 in decimale) singolarmente o CR seguito da LF (CR + LF, 0x0D 0x0A); Questi caratteri si basano sui comandi della stampante: l'alimentazione della riga indicava che una riga di carta doveva essere espulsa dalla stampante e un ritorno a capo indicava che il carrello della stampante doveva tornare all'inizio della riga corrente.

Ecco i dettagli .


5

Il triste stato di "separatori di record" o di "terminatori di riga" è un retaggio dei secoli bui dell'informatica.

Ora diamo per scontato che tutto ciò che vogliamo rappresentare siano in qualche modo dati strutturati e conformi a varie astrazioni che definiscono linee, file, protocolli, messaggi, markup, qualunque cosa.

Ma una volta questo non era esattamente vero. Caratteri di controllo integrati nelle applicazioni ed elaborazione specifica del dispositivo. I sistemi cerebrali che richiedevano sia CR che LF semplicemente non avevano astrazione per separatori di record o terminatori di linea. Il CR era necessario per ottenere il teletipo o la visualizzazione del video per tornare alla colonna uno e l'LF (oggi, NL, stesso codice) era necessario per farlo avanzare alla riga successiva. Immagino che l'idea di fare qualcosa di diverso dallo scaricamento dei dati grezzi sul dispositivo fosse troppo complessa.

Unix e Mac hanno effettivamente specificato un'astrazione per la fine della linea, immaginatelo. Purtroppo, ne hanno specificati diversi. (Unix, ahem, è arrivato per primo.) E naturalmente hanno usato un codice di controllo che era già "vicino" a SOP

Poiché quasi tutto il nostro software operativo oggi è un discendente del software operativo Unix, Mac o MS, siamo bloccati dalla confusione della linea.


1

NL derivato da NL EBCDIC = x'15 'che logicamente si confronta con CRLF x'odoa ascii ... questo diventa evidente quando si spostano fisicamente i dati dai mainframe alla gamma media. Coloquialmente (poiché solo le persone arcane usano ebcdic) NL è stata identificata con CR o LF o CRLF

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.