Perché Windows utilizza CR LF?


87

Capisco la differenza tra i due, quindi non c'è bisogno di approfondirlo, ma mi chiedo solo quale sia il ragionamento alla base del motivo per cui Windows utilizza sia CR che LF per indicare un'interruzione di riga. Sembra che il metodo Linux (usando solo LF) abbia molto più senso, risparmia spazio ed è più facile da analizzare.




Ecco wikipedia sulla storia del newline: en.wikipedia.org/wiki/Newline#History
Szocske

Potrebbe valere la pena notare che CRLF su Windows è principalmente solo una convenzione / impostazione predefinita. La maggior parte dei programmi supporta entrambi (anche se potresti dover modificare le impostazioni). Personalmente non uso quasi mai CRLF, optando invece per l'LF in stile UNIX; solo una manciata di programmi ha ancora problemi con i file che usano solo LF.
Kevin

CR + LF è il modo corretto per farlo (è lo standard ), quindi la domanda non è perché Windows lo fa correttamente, ma perché Mac e Unix / Linux lo fanno in modo errato. L'eredità di Standalone LF è la pigrizia e il prendere una scorciatoia. Ho sempre CR + LF, tranne per alcune cose di Linux che gawk a CR + LF, quindi cambio in modalità LF per questo. IMO, interpretare erroneamente CR + LF è molto peggio che interpretare erroneamente un LF autonomo.
InterLinked

Risposte:


97

Storicamente quando si utilizza stampanti a matrice di punti telescriventi CR il carrello alla prima posizione della riga mentre LF avanzerebbe alla riga successiva. L'utilizzo di CR + LF nel file stesso ha reso possibile inviare un file direttamente alla stampante, senza alcun tipo di driver della stampante.

Grazie @zaph sottolineando che erano telescriventi e non stampanti a matrice di punti


47
Fastidio molto comune per un vantaggio minimo.
Dávid Horváth

7
@ Anders In realtà erano i telescriventi il ​​motivo, CR ha restituito la testina di stampa a sinistra e LF ha fatto avanzare il foglio. I telescriventi precedevano le stampanti a matrice di punti.
Zaph

5
@zaph Questo è il motivo per cui amo Stack Overflow. 2 anni dopo, ho ricevuto una correzione e ho imparato qualcosa di nuovo.
Anders Abel

Poiché Windows ha seguito Unix per così tanti anni, è sconcertante che non abbiano seguito il modello Unix di LF.
belanger

32

@sshannin ha pubblicato un URL dal blog di Raymond Chen, ma non funziona più. Il blog ha cambiato il suo software interno, quindi gli URL sono cambiati.

Dopo aver strisciato tra i vecchi post nel nuovo blog, l'ho trovato qui .

Citazione dal blog:

Perché il terminatore di riga è CR + LF?

Questo protocollo risale ai tempi delle telescriventi. CR sta per "ritorno a capo" - il carattere di controllo CR ha riportato la testina di stampa ("carrello") alla colonna 0 senza far avanzare la carta. LF sta per "linefeed" - il carattere di controllo LF fa avanzare la carta di una riga senza spostare la testina di stampa. Quindi, se si desidera riportare la testina di stampa alla colonna zero (pronta per stampare la riga successiva) e far avanzare la carta (in modo che stampi su carta nuova), sono necessari sia CR che LF.

Se vai ai vari documenti del protocollo Internet, come RFC 0821 (SMTP), RFC 1939 (POP), RFC 2060 (IMAP) o RFC 2616 (HTTP), vedrai che tutti specificano CR + LF come sequenza di terminazione di linea. Quindi la vera domanda non è "Perché CP / M, MS-DOS e Win32 usano CR + LF come terminatore di riga?" ma piuttosto "Perché altre persone hanno scelto di differire da questi documenti standard e hanno utilizzato un altro terminatore di riga?"

Unix ha adottato LF semplice come sequenza di terminazione della riga. Se guardi le opzioni di stty, vedrai che l'opzione onlcr specifica se un LF deve essere cambiato in CR + LF. Se sbagli questa impostazione, ottieni il testo a gradini, dove

each
    line
        begins 

dove si era interrotta la riga precedente. Quindi anche unix, se lasciato in modalità raw, richiede CR + LF per terminare le linee. Il CR implicito prima di LF è un'invenzione unix, probabilmente come economia, poiché salva un byte per riga.

L'ascendenza unix del linguaggio C ha portato questa convenzione nello standard del linguaggio C, che richiede solo "\ n" (che codifica LF) per terminare le righe, facendo gravare sulle librerie di runtime l'onere di convertire i dati dei file grezzi in righe logiche.

Il linguaggio C ha anche introdotto il termine "newline" per esprimere il concetto di "terminatore di riga generico". Mi è stato detto che il comitato ASCII ha cambiato il nome del carattere 0x0A in "newline" intorno al 1996, quindi il livello di confusione è stato aumentato ancora di più.

Ecco un'altra discussione sull'argomento, da una prospettiva unix

Ho modificato questo secondo collegamento in un'istantanea in The Wayback Machine, poiché la pagina effettiva non è più disponibile.

Spero che questo risponda alla tua domanda.


Dal momento che non stai davvero rispondendo alla domanda, ma solo correggendo un collegamento, che è diventato obsoleto, in un commento , questo dovrebbe davvero essere un commento. Comunque, grazie per il link corretto. Aggiungilo come commento, questa risposta potrebbe essere eliminata.
Tom Brunberg

1
OK, ho aggiunto qui il testo dal blog, quindi se il link va di nuovo male il testo è ancora disponibile qui. Penso che questo dovrebbe essere mantenuto come una risposta, non solo un commento, poiché questa informazione risponde effettivamente alla domanda originariamente posta.
OMA

9
Io davvero odio il modo in cui Microsoft obsoletes loro collegamenti su base regolare.
Mark Ransom

2
Questa risposta è più dettagliata di quella esclusa e risponde non solo alla domanda posta ma anche alla ragione indovinata della domanda, IMHO è meglio.
Alexei Martianov

18

Proviene dalle telescriventi (e macchine da scrivere) dei tempi passati.

In passato, quando hai finito di digitare una riga, dovevi spostare il carrello della macchina da scrivere (che conteneva il foglio e scorreva a sinistra mentre digitavi) all'inizio della riga (CR). Quindi era necessario far avanzare il foglio di una riga (LF) per passare alla riga successiva.

Ci sono casi in cui potresti non voler avanzare riga quando restituisci il carrello, come se avessi barrato un carattere con un trattino (lo avresti semplicemente sovrascritto).

Ma fondamentalmente, si riduce alla convenzione. DOS ha utilizzato la convenzione CR / LF completa e UNIX l'ha accorciata un po '. Adesso siamo bloccati!


2

Altri hanno dato la risposta, ma volevo aggiungere ... immagino che tu sia troppo giovane per aver usato una macchina da scrivere? ;) Il carrello è un tamburo. Spostandolo orizzontalmente a destra, riporta la testina di tipo stazionario sul margine sinistro della pagina. Ruotando il carrello usando il dito e il pollice si fa avanzare la pagina di una riga (e).


2
Macchina da scrivere? Penso di averne visto uno in un museo una volta :)
Kyle

@Kyle ho dovuto ridere e questo ha illuminato la mia giornata :)
likejudo

1

Da Wikipedia :

La sequenza CR + LF era di uso comune su molti dei primi sistemi informatici che avevano adottato macchine telescriventi, tipicamente un ASR33, come dispositivo di console, perché questa sequenza era richiesta per posizionare quelle stampanti all'inizio di una nuova linea.


1

Ho visto più di un account secondo cui il motivo per inviare due caratteri (e talvolta più) invece di uno era per abbinare meglio la velocità di trasferimento dei dati alla velocità di stampa fisica ( questo è stato molto tempo fa ). Lo spostamento della testina di stampa richiedeva più tempo rispetto alla stampa di un singolo carattere e l'invio di caratteri extra era un modo per impedire che il trasferimento dei dati superasse il dispositivo di stampa. Quindi il motivo per cui abbiamo più caratteri per la fine della riga in Windows è fondamentalmente lo stesso del motivo per cui abbiamo tastiere QWERTY: era destinato a rallentare le cose .

Ovviamente il motivo per cui questa pratica continua in Windows fino ad oggi si basa su qualche nozione di compatibilità con le versioni precedenti in corso e, in ultima analisi, solo semplice inerzia.

Da notare, tuttavia, che questa convenzione non viene applicata rigorosamente da Windows a livello di sistema operativo . Qualsiasi applicazione Windows è libera di ignorare la convenzione, a seconda di quali altre applicazioni sta cercando di essere compatibile.

È interessante notare che l' articolo di Wikipedia su "Newline" afferma che Windows 8 potrebbe introdurre una modifica all'utilizzo solo di LF. L'articolo afferma anche che Mac OS X ha introdotto una transizione da LF + CR a solo LF.


4
"Destinato a rallentare le cose" - citazione necessaria.
Elliot Gorokhovsky

4
In realtà, l'intero primo paragrafo - citazione necessaria.
Elliot Gorokhovsky

2
Ecco un articolo di Jeff Atwood strettamente correlato che fa riferimento allo stesso contenuto di Wikipedia: The Great Newline Schism . Ci sono anche molti commenti intelligenti degli utenti, incluse alcune prove del mio punto che non si tratta di un problema a livello di sistema operativo e che la maggior parte delle app di Windows funzionerà perfettamente con file di testo solo LF. C'è anche il commento divertente: "Windows 10 utilizza CR / LF per mantenere la compatibilità con la macchina telescrivente Modello 33 del 1963 ".
Brent Bradburn

1
@ RenéG Non ho bisogno di una citazione, ero lì e l'ho visto di persona. Alcune delle prime stampanti a matrice di punti richiedevano anche alcuni NUL extra aggiunti per buona misura, perché all'aumentare della velocità di trasmissione dell'interfaccia, la testina non riusciva a tenere il passo anche con due caratteri di tempo. Il problema è scomparso quando il buffering e il controllo del flusso sono entrati nell'immagine, ma le prime stampanti non lo avevano. Infine, quando le stampanti diventavano solo output, passavano a un'interfaccia parallela che aveva l'handshaking incorporato.
Mark Ransom

1
"Contrariamente alla credenza popolare, il layout QWERTY non è stato progettato per rallentare il dattilografo, ..." - Proprietà | QWERTY - Wikipedia
Jason Sparc
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.