it-swarm-eu.dev

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

Ja ja, mir ist bekannt, dass '\n' Eine neue Zeile unter UNIX schreibt, während es für Windows die zwei Zeichen gibt: '\r\n'. Das alles ist theoretisch sehr schön, aber meine Frage ist warum ? Warum ist das Wagenrücklaufzeichen in Windows extra? Wenn UNIX dies in \n Schaffen kann, warum benötigt Windows zwei Zeichen, um dies zu tun?

Ich lese David Beazleys Python Buch und er sagt:

Unter Windows gibt das Schreiben des Zeichens '\ n' beispielsweise die aus zwei Zeichen bestehende Sequenz '\ r\n' aus (und beim Zurücklesen der Datei wird '\ r\n' wieder in ein einzelnes '\ n' übersetzt. Charakter).

Warum der zusätzliche Aufwand?

Ich werde ehrlich sein. Ich kenne den Unterschied schon lange, habe mich aber nie gefragt, warum. Ich hoffe das wird heute beantwortet.

Vielen Dank für Ihre Zeit.

108
sukhbir

Rückwärtskompatibilität.

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

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

Deshalb. Und ja, es ist ärgerlich, aber es ist Teil des Pakets, das es MS-DOS ermöglicht hat, CP/M zu gewinnen, und Windows 95, alle anderen GUIs zusätzlich zu DOS zu gewinnen, und Windows XP von Windows 98 zu übernehmen.

(Hinweis: Moderne Laserdrucker verfügen weiterhin über diese Befehle, da auch sie mit früheren Druckern abwärtskompatibel sind - insbesondere HP tun dies gut.)

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

133
user1249

Soweit mir bekannt ist, geht dies auf die Zeit der Schreibmaschinen zurück.

\r ist Wagenrücklauf, der sich dort bewegt, wo Sie auf der Seite tippen, nach links zurück (oder nach rechts, wenn dies Ihre Kultur ist).

\n ist eine neue Zeile, die Ihr Papier um eine Zeile nach oben bewegt.

Wenn Sie nur eine dieser Aufgaben mit einer Schreibmaschine ausführen, befinden Sie sich an der falschen Stelle, um eine neue Textzeile zu schreiben.

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

21
Matt Ellen

Ich weiß nicht, ob dies allgemein bekannt ist, aber es sollte beachtet werden, dass CR von modernen Terminalemulatoren immer noch 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
9
Daniel Lubarov

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

Wagenrücklauf bedeutete "das Bit, mit dem Sie eingeben, an den Zeilenanfang zurückgeben".

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

Unix hat seine\n-Konvention kopiert, weil Multics dies getan hat.

Ich vermute, wenn Sie weit genug zurück graben, werden Sie eine politische Meinungsverschiedenheit zwischen Implementierern finden!

(Sie haben das zusätzliche lustige Bit weggelassen, bei dem die Mac-Konvention darin besteht (oder früher war), nur CR zum Trennen von Zeilen zu verwenden. Und jetzt hat Unicode auch ein eigenes Zeilentrennzeichen, U + 2028!)

7
Frank Shearar

Geschichte des Newline-Charakters (Wikipedia):

ASCII wurde gleichzeitig von der ISO und der ASA, der Vorgängerorganisation von ANSI, entwickelt. In der Zeit von 1963 bis 1968 unterstützten die ISO-Normenentwürfe die Verwendung von CR + LF oder LF allein als Zeilenumbruch), während die ASA-Entwürfe nur CR + LF unterstützten.

Die Sequenz CR + LF wurde häufig auf vielen frühen Computersystemen verwendet, die Fernschreibmaschinen, typischerweise einen ASR33, als Konsolengerät verwendet hatten, da diese Sequenz erforderlich war, um diese Drucker am Anfang einer neuen Zeile zu positionieren. Auf diesen Systemen wurde Text häufig routinemäßig erstellt, um mit diesen Druckern kompatibel zu sein, da das Konzept der Gerätetreiber, die solche Hardwaredetails vor der Anwendung verbergen, noch nicht gut entwickelt war. 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 der CR gesendet. Tatsächlich war es oft notwendig, zusätzliche Zeichen (überflüssige CRs oder NULs, die ignoriert werden) zu senden, um dem Druckkopf Zeit zu geben, sich zum linken Rand zu bewegen.

Selbst nachdem 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, für die mehrere Zeichen erforderlich waren, um durch die Anzeige zu scrollen.

MS-DOS (1981) übernahm CP/Ms CR + LF; Die Verwendung von CR + LF durch CP/M war sinnvoll für die Verwendung von Computerterminals über serielle Leitungen. Diese Konvention wurde vom späteren Windows-Betriebssystem von Microsoft übernommen.

Das Multics-Betriebssystem begann 1964 mit der Entwicklung und verwendete LF allein als neue Zeile. Unix folgte der Multics-Praxis, und spätere Systeme folgten Unix.

6
Craige

Was ist mit den Leuten, die fragen "Warum kann Unix \n Und 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 dort, wo das Betriebssystem textbasierte Konfigurations- oder Befehlszeilenbefehle liest/schreibt, ist es nicht sinnvoll, das Betriebssystem zu bemängeln.
  2. Die meisten Windows-Apps können sowohl \n Als auch \r\n Gut lesen. Sie geben auch \r\n Aus, damit alle glücklich sind. Ein Programm "macht" nicht einfach entweder \n Oder \r\n - es akzeptiert das eine, das andere, oder beides 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 robustesten 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) \n Anstelle von dem richtigen\r\n.
  4. Eine viel relevantere Frage ist, warum so viele moderne Unix-Apps nur \n Ausgeben und wissen, dass es einige Protokolle und Programme gibt, die es nicht mögen.
5
Rei Miyasaka

Der Grund, warum die Konventionen auf ihren verschiedenen Systemen gelten (\ n auf Unix-Systemen,\r\n unter Windows usw.), ist, dass Sie eine Konvention, sobald Sie sie ausgewählt haben, NICHT mehr ändern können, ohne eine Reihe von Dateien zu beschädigen. Und das ist im Allgemeinen verpönt.

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

Windows kam von DOS, daher lautet die Frage für Windows wirklich: 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önnten bestimmte Teletypmodelle eine Rolle gespielt haben.

4
Michael Kohne

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

Dieses Protokoll stammt aus der Zeit der Teletypewriter. CR steht für "Wagenrücklauf" - das CR-Steuerzeichen gab den Druckkopf ("Wagen") in Spalte 0 zurück, ohne das Papier vorzuschieben. LF steht für "Zeilenvorschub" - das Steuerzeichen LF Steuerzeichen hat das Papier um eine Zeile vorgerückt, ohne den Druckkopf zu bewegen. Wenn Sie also den Druckkopf zurücksetzen möchten Spalte Null (bereit zum Drucken der nächsten Zeile) und Vorrücken des Papiers (damit es auf frischem Papier gedruckt wird). Sie benötigen sowohl CR als auch LF.

Wenn Sie zu den verschiedenen Internetprotokolldokumenten wie RFC 0821 (SMTP), RFC 1939 (POP), RFC 2060 (IMAP) oder RFC 2616 (HTTP) gehen, werden Sie feststellen, dass alle CR + LF als angeben Zeilenabschlusssequenz. Die eigentliche Frage lautet also nicht: "Warum verwenden CP/M, MS-DOS und Win32 CR + LF als Leitungsabschluss?" sondern "Warum haben andere Leute beschlossen, sich von diesen Standarddokumenten zu unterscheiden und einen anderen Leitungsabschluss zu verwenden?"

Unix hat plain LF als Zeilenabschlusssequenz übernommen. Wenn Sie sich die stty-Optionen ansehen, werden Sie sehen, dass die Option onlcr angibt, ob a LF sein soll) geändert in CR + LF. Wenn Sie diese Einstellung falsch machen, erhalten Sie Treppenstext, wo

each
    line
        begins

wo die vorherige Zeile aufgehört hat. Selbst wenn Unix im Raw-Modus belassen wird, ist CR + LF erforderlich, um Zeilen zu beenden. Die implizite CR vor LF ist eine Unix-Erfindung, wahrscheinlich als Wirtschaftlichkeit, da sie ein Byte pro Zeile spart.

Die Unix-Abstammung der C-Sprache übertrug diese Konvention in den C-Sprachstandard, der nur "\ n" (das LF codiert) zum Beenden von Zeilen benötigt, was die Laufzeitbibliotheken belastet, Rohdaten in logische Zeilen umzuwandeln.

Die C-Sprache führte auch den Begriff "Newline" 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, sodass die Verwirrung noch höher ist.

2
Ondra Žižka