Unterschied zwischen '\ n' und '\ r \ n'


99

Ja ja, ich bin mir dessen bewusst , dass '\n'eine neue Zeile in UNIX schreibt , während für Windows gibt es die zwei Zeichenfolge ist: '\r\n'. Theoretisch ist das alles sehr schön, aber meine Frage ist warum ? Warum ist das Wagenrücklaufzeichen in Windows extra? Wenn UNIX das kann, \nwarum braucht Windows dafür zwei Zeichen?

Ich lese David Beazleys Python-Buch und er sagt:

Wenn Sie zum Beispiel unter Windows das Zeichen '\ n' schreiben, wird die zweistellige Folge '\ r \ n' ausgegeben (und beim Zurücklesen der Datei wird '\ r \ n' zurück in ein einzelnes '\ n' übersetzt). Charakter).

Warum der Mehraufwand?

Ich werde ehrlich sein. Ich kenne den Unterschied seit langer Zeit, habe mich aber nie darum gekümmert, WARUM zu fragen. Ich hoffe das wird heute beantwortet.

Vielen Dank für Ihre Zeit.


5
Es sollte auch beachtet werden, dass Windows nicht die einzige ist, die verwendet wird \r\n. Es wird auch von den meisten textbasierten Internetprotokollen (z. B. SMTP, HTTP usw.) verwendet, und zwar weitgehend aus demselben Grund wie Windows (dh aus dem Verlauf).
Dean Harding

3
Wenn Sie in Java Format-Strings (z. B. System.out.printf()oder String.format()) verwenden, stellen Sie außerdem sicher, dass Sie diese aus %nGründen der Betriebssystemkompatibilität als CRLF verwenden. \nist veraltet.
Gary Rowe

Ich habe \n\rmehrmals gesehen. (Ich denke, es war etwas von NetWare.)
Grawity


1
Es gibt nur sehr wenige Windows-Programme, für die CRLF erforderlich ist. CRLF ist möglicherweise die Standardeinstellung, aber fast alles erkennt automatisch und verwendet LF. Ich habe alle meine Texteditoren unter Windows so konfiguriert, dass sie LFs für alle neuen Dateien verwenden, und das ist wirklich kein Problem.
Kevin

Antworten:


124

Rückwärtskompatibilität.

Windows ist abwärtskompatibel mit MS-DOS (aggressiv sogar) und MS-DOS verwendete die CR-LF-Konvention, da MS-DOS mit CP / M-80 (etwas zufällig) kompatibel war, das die CR-LF-Konvention aus diesem Grund verwendete war, wie Sie einen Drucker fuhren (weil Drucker ursprünglich computergesteuerte Schreibmaschinen waren).

Drucker haben einen separaten Befehl, um das Papier um eine Zeile nach oben in eine neue Zeile zu verschieben, und einen separaten Befehl, um den Wagen (in dem das Papier eingelegt war) zurück an den linken Rand zu bewegen.

Deshalb. Und ja, es ist ärgerlich, aber es ist Teil des Pakets, das es MS-DOS ermöglichte, CP / M und Windows 95 für alle anderen GUIs außer DOS zu gewinnen und Windows XP für die Übernahme von Windows 98.

(Hinweis: Moderne Laserdrucker verfügen immer noch über diese Befehle, da sie auch mit früheren Druckern abwärtskompatibel sind. Dies ist insbesondere bei HP gut möglich.)

Für diejenigen, die mit Schreibmaschinen nicht vertraut sind, ist hier ein Video zu sehen, wie das Tippen durchgeführt wurde: http://www.youtube.com/watch?v=LJvGiU_UyEQ . Beachten Sie, dass das Papier zuerst nach oben bewegt wird und dann der Wagen zurückgebracht wird, auch wenn dies in einer einfachen Bewegung geschieht. Das Ding teilte der Schreibkraft mit, dass das Ende nahe sei, und bereitete sich darauf vor.


3
Wie hat Unix mit seinen \ n nur mit diesen alten Druckern gearbeitet? Ich nehme an, sie hatten Unix-Konsolen an Schreibmaschinendrucker angeschlossen?
Senthil Kumaran

3
@Senthil, in Unix wird das Zeilenumbruchzeichen vom Endtreiber konvertiert. Es ist nur eine andere Designentscheidung.

2
@Senthil, genauer gesagt, in Unix werden Drucker und Terminals im Betriebssystem abstrahiert, und ihre Beschreibung bestimmt, welche Bytefolgen für das Gerät generiert werden. CP / M hatte keine solche Abstraktion, die alles dem laufenden Programm überließ. Dies ist höchstwahrscheinlich darauf zurückzuführen, dass dies nicht von allen Programmen benötigt wurde, sodass Programme, die es nicht benötigen, wertvollen Speicherplatz benötigen. Denken Sie daran, dass CP / M für ein 16- Kilobyte- System konzipiert wurde.

1
"Ein wichtiges Konstruktionsmerkmal des wohl fortschrittlichsten Transportsystems der Welt wurde also ursprünglich durch die Breite des Esels eines Pferdes bestimmt." Und so ist es auch mit der Software. astrodigital.org/space/stshorse.html
Ryan Michela

1
@ Ryan, urbane Legende. Debunked unter snopes.com/history/american/gauge.htm

20

Soweit ich weiß, geht dies auf die Zeit der Schreibmaschinen zurück.

\r ist ein Wagenrücklauf, der das ist, was sich bewegt, wenn Sie auf der Seite nach links zurückschreiben (oder nach rechts, wenn das Ihre Kultur ist)

\n ist eine neue Zeile, die das Papier um eine Zeile nach oben verschiebt.

Wenn Sie nur eine davon mit einer Schreibmaschine ausführen, sind Sie an der falschen Stelle, um mit dem Schreiben einer neuen Textzeile zu beginnen.

Als Computer entstanden, haben vermutlich einige Leute das alte Modell beibehalten, aber andere haben erkannt, dass es nicht notwendig ist, und haben eine vollständige neue Zeile als ein Zeichen gekapselt.


7
Warum bleibt Windows also immer noch dabei?
Suchbir

8
Rückwärtskompatibilität. Stellen Sie sich vor, wie viele Textdokumente brechen würden, wenn sie jetzt geändert würden
Matt Ellen

4
Streng genommen ist der "seltsame Punkt" hier das unixoide "use newline only", das anfänglich (glaube ich) gemacht wurde, um die Anzahl der gespeicherten Zeichen zu verringern (die Übersetzung in CR LF erfolgt im Terminal-Treiber, es ist das "onlcr" -Flag) das steuert es für die Ausgabe
Vatine

3
Windows hatte einen Vorgänger namens DOS, der das gleiche Zeilenende hatte. Windows hat die Kompatibilität beibehalten. DOS hatte selbst Vorgänger, nämlich CP / M. Das verwendete auch CRLF. DOS hielt die Kompatibilität aufrecht. Die Entwicklung von CP / M wurde von DECs TOPS beeinflusst. Und Sie können erraten, welche Zeilenumbrüche sie verwendet haben. :-) Kompatibilität erklärt vieles.
Mnementh

5
OK, aber warum erkennt Editor immer noch keine "\ n" Zeilenenden?
Dan04

8

Ich weiß nicht, ob dies allgemein bekannt ist, aber es sollte beachtet werden, dass CR immer noch von modernen Terminalemulatoren verstanden wird:

$ printf "hey world\rsup\n"
sup world

Es ist praktisch für Fortschrittsanzeigen, z

for i in {1..100}
do
    printf "\rLoading... %d%%" $i
    sleep 0.01
done
echo

1
Bei den alten IBM Zeilendruckern (z. B. 1403) bestand die Konvention darin, das erste Zeichen des Zeilenpuffers als Wagensteuerzeichen zu behandeln. Leer soll eine Zeile vorrücken und drucken. Plus sollte Abstände weglassen und wurde zB zum Unterstreichen verwendet. Eine Null bedeutete das Doppelte und ein Minus das Dreifache. Eine '1' am oberen Rand der nächsten Seite und andere Ziffern, die zu benutzerdefinierten vertikalen Positionen vorrücken (zum Ausfüllen vorgedruckter Formulare).
George

7

In der Vergangenheit bedeutete Zeilenvorschub, dass die Walze - die Walze, auf der Sie tippen - eine Zeile drehte, sodass Text in der nächsten Zeile ... aber in der nächsten Spalte angezeigt wurde.

Carriage Return bedeutete "Rückgabe des Bits, mit dem Sie an den Zeilenanfang tippen".

Windows verwendet CR + LF, weil MS-DOS, CP / M, weil es für serielle Leitungen sinnvoll war.

Unix hat seine Konvention kopiert, weil Multics dies getan hat.

Ich vermute, wenn Sie weit genug zurück graben, werden Sie eine politische Meinungsverschiedenheit zwischen den Umsetzern feststellen!

(Sie haben das Extra-Spaß-Bit weggelassen, bei dem die Mac-Konvention (oder früher) nur die Verwendung von CR zum Trennen von Zeilen war. Und jetzt hat Unicode auch einen eigenen Zeilentrenner, U + 2028!)


Beeindruckend! Ich wusste nichts über den Mac ...
Michael K

Ich bin mir nicht sicher, ob Sie eine politische Meinungsverschiedenheit finden würden. Es ist auch möglich, dass Sie Leute finden, die ähnliche Dinge unabhängig voneinander tun.
David Thornley

1
Wann sind verschiedene Normungsgremien beteiligt? Es würde mich überraschen, keine politischen Gründe zu finden!
Frank Shearar

6

Geschichte des Newline-Charakters (Wikipedia):

ASCII wurde gleichzeitig von der ISO und der ASA, der Vorgängerorganisation von ANSI, entwickelt. Während des Zeitraums von 1963 bis 1968 unterstützten die ISO-Standardentwürfe die Verwendung von CR + LF oder LF allein als Zeilenvorschub, während die ASA-Entwürfe nur CR + LF unterstützten.

Die Sequenz CR + LF war in vielen frühen Computersystemen gebräuchlich, in denen Fernschreiber, typischerweise ein ASR33, als Konsolengerät verwendet wurden, da diese Sequenz erforderlich war, um diese Drucker am Anfang einer neuen Zeile zu positionieren. Auf diesen Systemen wurde häufig routinemäßig Text verfasst, um mit diesen Druckern kompatibel zu sein, da das Konzept von Gerätetreibern, die solche Hardwaredetails vor der Anwendung verstecken, noch nicht gut entwickelt war. Die Anwendungen mussten direkt mit dem Fernschreiber sprechen und dessen Konventionen befolgen.

Die Trennung der beiden Funktionen verbarg die Tatsache, dass der Druckkopf nicht in einem Zeichen von ganz rechts zum Anfang der nächsten Zeile zurückkehren konnte. Deshalb wurde die Sequenz immer zuerst mit dem CR gesendet. Tatsächlich war es oft notwendig, zusätzliche Zeichen (externe CRs oder NULs, die ignoriert werden) zu senden, um dem Druckkopf Zeit zu geben, sich zum linken Rand zu bewegen.

Selbst nachdem die Teletypen durch Computerterminals mit höheren Baudraten ersetzt wurden, unterstützten viele Betriebssysteme das automatische Senden dieser Füllzeichen, um die Kompatibilität mit billigeren Terminals zu gewährleisten, die mehrere Zeichen zum Scrollen der Anzeige benötigten.

MS-DOS (1981) übernahm CP / Ms CR + LF; Die Verwendung von CR + LF durch CP / M machte Sinn, um Computerterminals über serielle Leitungen zu verwenden. Diese Konvention wurde vom späteren Windows-Betriebssystem von Microsoft übernommen.

Das Multics-Betriebssystem begann 1964 mit der Entwicklung und verwendete nur LF als Zeilenvorschub. Unix folgte der Multics-Praxis und spätere Systeme folgten Unix.


Auf dem alten IBM 2741-Drucker-Tastatur-Terminal war die Druckerkomponente eine Kugelschreibmaschine vom Typ IBM Selectric. Das Ändern in Großbuchstaben führte dazu, dass sich der Ball drehte, was zusätzliche Zeit in Anspruch nahm. Im EBCDIC-Zeichencode hatten Großbuchstaben ein 1-Bit an Position 6. Ein EBCDIC-Leerzeichen (0x40) war also Großbuchstaben! Wenn Sie ein langes Dokument (z. B. eine Diplomarbeit) drucken, können Sie die Ausgabe erheblich beschleunigen, indem Sie Leerzeichen zwischen Wörtern in Kleinbuchstaben oder Leerzeichen in Kleinbuchstaben (sie verwenden ein anderes Zeichen, IL, wenn der Speicher dazu dient, notwendige Verzögerungen einzuführen, z , wenn Sie zurückkehren oder tabbing).
George

5

Was ist mit der Frage "Warum kann Unix \nund nicht Windows?" Es ist so eine seltsame Frage.

  1. Das Betriebssystem hat fast nichts damit zu tun. Es geht eher darum, wie Apps, Bibliotheken, Protokolle und Dateiformate mit Dingen umgehen. Anders als wenn das Betriebssystem textbasierte Konfigurations- oder Befehlszeilenbefehle liest / schreibt, macht es keinen Sinn, das Betriebssystem zu fehlerhaft zu machen.
  2. Die meisten Windows-Apps können beides lesen \nund sind in \r\nOrdnung. Sie geben auch aus, \r\ndamit jeder glücklich ist. Ein Programm "tut" nicht einfach eines \noder \r\n- es akzeptiert das eine, das andere oder beide und gibt das eine, das andere oder beide aus.
  3. Als Programmierer sollte Sie das eigentlich fast nie stören. Praktisch jede Sprache / Plattform verfügt über die Möglichkeit, die richtige Endzeile zu schreiben und am besten zu lesen. Das einzige Mal, dass ich mich mit dem Problem befassen musste, war, als ich einen HTTP-Server schrieb - und das lag daran, dass ein bestimmter Browser (Hinweis: der nächstbeliebteste Browser nach dem IE) dies \nanstelle des richtigen tat \r\n.
  4. Eine viel relevantere Frage ist, warum so viele moderne Unix-Apps nur dann \nvollständig ausgeben, wenn sie wissen, dass es einige Protokolle und Programme gibt, die sie nicht mögen.

3
Eine weitere wichtige Frage: Da viele Protokolle hauptsächlich auf Unix-Systemen entwickelt wurden, warum haben sie nicht '\ n' verwendet?
David Thornley

@DavidThornley Weil \ r \ n eher plattformübergreifend funktioniert (\ r für ältere Macs, \ r \ n für Windows und \ n für * nix).
Basic

4

Der Grund, warum die Konventionen für die verschiedenen Systeme gelten (\ n auf Unix-Systemen, \ r \ n unter Windows usw.), besteht darin, dass Sie eine Konvention nicht ändern können, ohne eine Reihe von Dateien zu beschädigen. Und das ist im Allgemeinen verpönt.

Unix-artige Systeme wurden (sehr früh) unter Verwendung verschiedener Teletypmodelle entwickelt, und irgendwann entschied jemand, dass die Ausrüstung bei einem Zeilenvorschub mit Wagenrücklauf versehen werden sollte.

Windows stammte aus DOS, daher stellt sich für Windows die Frage: Warum hat DOS diese cr / lf-Sequenz verwendet? Ich vermute, es hat etwas mit CP / M zu tun, wo DOS einige seiner Wurzeln hat. Auch hier können bestimmte Modelle des Teletyps eine Rolle gespielt haben.


Hmm, interessant.
Sukhbir

1
Warum kann Windows keine Zeilen verarbeiten , die mit enden \n, aber vorerst weiterhin verwenden \r\n? Wenn sie dies ab Windows XP tun würden, könnten sie jetzt anfangen, Dateien mit zu speichern, \nanstatt mit \r\n.
DisgruntledGoat

1
Windows hat nichts damit zu tun. Es ist die Entscheidung der Apps, und die meisten Apps lesen sowohl '\ n' als auch '\ r \ n' und schreiben '\ r \ n' - damit alle glücklich sind.
Rei Miyasaka

2

Hier ist eine Antwort von der besten Quelle - Microsoft. Warum ist der Leitungsabschluss CR + LF?

Dieses Protokoll stammt aus den Tagen der Teletypewriters. CR steht für "Wagenrücklauf" - Das CR-Steuerzeichen hat den Druckkopf ("Wagen") in Spalte 0 zurückgesetzt, ohne das Papier vorzuschieben. LF steht für "Zeilenvorschub" - das LF-Steuerzeichen schob das Papier eine Zeile vor, ohne den Druckkopf zu bewegen. Wenn Sie also den Druckkopf auf Spalte Null zurückstellen möchten (bereit zum Drucken der nächsten Zeile) und das Papier vorschieben möchten (damit es auf frischem Papier gedruckt wird), benötigen Sie sowohl CR als auch LF.

Wenn Sie zu den verschiedenen Internetprotokolldokumenten wechseln, z. B. RFC 0821 (SMTP), RFC 1939 (POP), RFC 2060 (IMAP) oder RFC 2616 (HTTP), werden Sie feststellen, dass in allen Dokumenten CR + LF als angegeben ist Leitungsabschlusssequenz. Die eigentliche Frage lautet also nicht "Warum verwenden CP / M, MS-DOS und Win32 CR + LF als Zeilenabschluss?" sondern "Warum haben sich andere entschieden, von diesen Normdokumenten abzuweichen und einen anderen Zeilenabschluss zu verwenden?"

Unix nahm LF als Zeilenabschlusssequenz an. Wenn Sie sich die stty-Optionen ansehen, werden Sie feststellen, dass die Option onlcr angibt, ob ein LF in CR + LF geändert werden soll. Wenn Sie diese Einstellung falsch machen, erhalten Sie einen schrittweisen Text

each
    line
        begins

wo die vorherige Zeile aufgehört hat. Sogar Unix benötigt im Raw-Modus CR + LF, um Zeilen zu terminieren. Das implizite CR vor LF ist eine Unix-Erfindung, wahrscheinlich als Economy, da es ein Byte pro Zeile einspart.

Die Unix-Vorfahren der C-Sprache führten diese Konvention in den C-Sprachstandard ein, der nur "\ n" (das LF codiert) zum Beenden von Zeilen erfordert, was die Laufzeitbibliotheken belastet, um Rohdatei-Daten in logische Zeilen umzuwandeln.

Die Sprache C führte auch den Begriff "Zeilenumbruch" ein, um das Konzept des "generischen Zeilenabschlusses" auszudrücken. Mir wurde gesagt, dass das ASCII-Komitee den Namen des Zeichens 0x0A um 1996 in "newline" geändert hat, so dass die Verwirrungsstufe noch weiter erhöht wurde.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.