Unterschied zwischen \ n und \ r?

609

Was ist der Unterschied zwischen \n(Zeilenumbruch) und \r(Wagenrücklauf)?

Gibt es insbesondere praktische Unterschiede zwischen \nund \r? Gibt es Orte, an denen einer anstelle des anderen verwendet werden sollte?

eozzy
quelle
3
Alle Antworten sind ziemlich vorhersehbar, aber ich wäre interessiert zu wissen, ob es irgendwelche PRAKTISCHEN Unterschiede zwischen \ n und \ r gibt. Gibt es Orte, an denen einer über den anderen verwendet werden sollte?
Vlad der Impala
9
Ja, Textdateien mit nur LF (Zeilenumbruch) werden in einigen Windows-Anwendungen nicht als beendet angesehen, und Textdateien, die mit CRLF beendet wurden, scheinen zusätzliche Zeichen zu haben, wenn sie in einigen Linus-Anwendungen geöffnet werden.
Pavium
2
Ja, \ r wird von einigen Linux-Konsolen-Apps verwendet, um rotierende Linienanimationen durchzuführen.
Murali
8
Ist \ r wirklich noch der normale Mac EOL? Ich bin sicher, es war für "Classic" Mac, aber ich hatte gedacht, OS X hätte Unixified. (Zeigt, wie vertraut ich mit Macs bin, was?)
John Y
11
In der Vergangenheit wurde ein \ n verwendet, um den Wagen nach unten zu bewegen, während das \ r verwendet wurde, um den Wagen zurück auf die linke Seite der Seite zu bewegen.
Karthik Gorijavolu

Antworten:

827

In Bezug auf ASCII-Code ist es 3 - da sie 10 bzw. 13 sind ;-).

Aber im Ernst, es gibt viele:

  • In Unix und allen Unix-ähnlichen Systemen bedeutet \nder Code für das Zeilenende \rnichts Besonderes
  • Infolgedessen ist in C und den meisten Sprachen, die es irgendwie kopieren (auch aus der Ferne), \ndie Standard-Escape-Sequenz für das Zeilenende (nach Bedarf in / aus betriebssystemspezifischen Sequenzen übersetzt).
  • In alten Mac-Systemen (vor OS X) \rwar stattdessen der Code für das Zeilenende
  • Unter Windows (und vielen alten Betriebssystemen) besteht der Code für das Zeilenende aus 2 Zeichen \r\nin dieser Reihenfolge
  • Als (überraschende ;-) Folge (die auf Betriebssysteme zurückgeht, die viel älter als Windows sind) \r\nist die Standard-Zeilenbeendigung für Textformate im Internet
  • Bei elektromechanischen teletypähnlichen "Terminals" wird \rder Schlitten angewiesen, nach links zurückzufahren, bis er den Anschlag ganz links erreicht (langsame Operation), \nund die Walze wird angewiesen, eine Linie aufzurollen (eine viel schnellere Operation) - das ist der Grund, den Sie immer haben \r vorher \n , damit sich die Walze bewegen kann, während der Wagen noch nach links fährt! -) Wikipedia hat eine detailliertere Erklärung .
  • für die Zeichenmodus - Terminals, im Basismodus (typischerweise geradzahlig ältere Druck diejenigen wie oben emulieren), \rund \nwirkt in ähnlicher Weise ( mit Ausnahme sowohl in Bezug auf den Cursor, wie es ist kein Schlitten oder Rollen ;-)

In der Praxis sollten Sie im modernen Kontext des Schreibens in eine Textdatei immer verwenden \n(die zugrunde liegende Laufzeit übersetzt dies, wenn Sie ein seltsames Betriebssystem verwenden, z. B. Windows ;-). Der einzige Grund für die Verwendung \rist, wenn Sie in ein Charakterterminal schreiben (oder eher in ein "Konsolenfenster", das es emuliert) und möchten, dass die nächste Zeile, die Sie schreiben, die zuletzt geschriebene überschreibt (manchmal für doofe "ASCII-Animationen verwendet) "Effekte von zB Fortschrittsbalken) - das wird in einer Welt von GUIs allerdings ziemlich veraltet ;-).

Alex Martelli
quelle
12
Um den Verlauf in dieser Antwort zu erweitern: Als die Zeilengeschwindigkeit von 10 Zeichen pro Sekunde anstieg, dauerte es mehr als 2 Zeichen, bis der Wagen zurückkehrte, und nach dem wurden zusätzliche harmlose Zeichen (normalerweise NUL, dh \0) hinzugefügt \n, um das Extra zuzulassen Zeit. Dies wurde vom Betriebssystem transparent gehandhabt, sodass Sie im Legacy-Code keine Spuren davon finden.
Mark Ransom
11
Wie ist Windows ein "seltsames" Betriebssystem?
Mailmindlin
31
@mailmindlin - Sie fragen "Wie ist Windows ein" seltsames "Betriebssystem?". Antwort: In mehr als ich leicht zählen kann (beim Tragen von Socken, also Zehen nicht erlaubt :-). Alle anderen überlebenden Betriebssysteme sind Unix-basiert ... Windows ist das einzige, WAY out in vielerlei Hinsicht. In diesem speziellen Q-Kontext ist es das einzige, das ZWEI Bytes (\ n \ r) als kanonisches Zeilenende setzt ... ohne vernünftigen Grund außer den altgeschichtlichen, die an anderer Stelle im Thread erklärt wurden ... jedes andere Betriebssystem hat ein einzelnes Zeichen a5 Zeilenende (99% + von ihnen `\ n ').
Alex Martelli
1
@nothingisnecessary: ​​Zum Beispiel tools.ietf.org/html/rfc5322 , das RFC 2822 ersetzte und das Format von E-Mail-Nachrichten definierte.
Keith Thompson
3
Ein kleiner Rat an alle, die irgendwann in ihrem Leben einen Parser schreiben werden - vergessen Sie niemals, das Ende von Zeilen richtig zu behandeln. Ich hatte einige ziemlich böse Erfahrungen damit, nur weil ich das vergessen habe \r(ich benutze Linux). Nachdem ich mit dem Parsen einer scheinbar gültigen Datei begonnen hatte, schlug mein Parser fehl, da die von mir analysierte Datei in Windows erstellt wurde. : D Das Hauptproblem in allem , was auch ist das \noder \rin dem Sinne sichtbar sind , dass zum Beispiel a, ., (etc. sind Zeichen.
Rbaleksandar
122

In der Vergangenheit \nwurde a verwendet, um den Wagen nach unten zu bewegen, während a \rverwendet wurde, um den Wagen zurück auf die linke Seite der Seite zu bewegen.

tster
quelle
8
Vielleicht keine schrecklich praktische Antwort auf eine Computerfrage, aber der historische Leckerbissen bekommt trotzdem eine positive Bewertung von mir.
John Y
1
Stellen Sie sich vor, Sie würden ähnlich sein, wenn Sie den Schreibteil Ihrer physischen Schreibmaschine nach links schieben. Rückkehr.
Jo Smo
2
\ n bewegt den Wagen nicht nach unten, sondern dreht die Walze, um das Papier nach OBEN zu bewegen.
Roddy
5
Jede Bewegung ist relativ. Das Papier ist meine Welt, und relativ dazu bewegt sich der Wagen nach unten: P
tster
2
FWIW, \ r kann auf modernen Systemen immer noch ein "Wagenrücklauf" sein. Betrachten Sie diesen C-Code. printf("abcdefghijlm\rNOP\n");Kompiliert mit gcc-8 unter OpenSuSe und ausgeführt auf einem Terminal, führt zu dieser Ausgabe NOPdefghijlm. Das \ r (Wagenrücklauf) in der Zeichenfolge führt dazu, dass sich der Cursor an den Zeilenanfang bewegt (Wagen) und die Zeichen nach \ r (dh "NOP") überschreiben, was zuvor dort war (dh das "abc")! Sie können mit printf("abcdefghijlm\b\bNOP\n");der abcdefghijNOP
Rücktaste
36

Zwei verschiedene Charaktere.

\n wird als Zeilenende-Terminator in Unix-Textdateien verwendet

\r wird als End-of-Line-Terminator in Mac-Textdateien verwendet

\r\n (dh beide) werden verwendet, um Zeilen in Windows- und DOS-Textdateien zu beenden.

Pavium
quelle
2
Beachten Sie, dass es Computer gibt / gab, die \ n \ r als Zeilenende-Markierung verwendet haben, als Sie die EINGABETASTE gedrückt haben, wie Acorn und RISC OS.
Anders
9
Zur Verdeutlichung: \rAuf einem Mac war es lange nicht mehr das Zeilenende. Mit der Veröffentlichung von Mac OS X im Jahr 2001 (das auf Unix basiert) \nwird nun verwendet.
Jbbuckley
3
Es gibt jedoch noch einige Anwendungen, die \rMS Office 2011 Excel verwenden: Speichern einer CSV (mit allen Standardeinstellungen), um eine ISO-8859-1-codierte Datei mit \r-line-Endungen zu speichern .
CodeBrauer
24

Da es sonst niemand speziell erwähnte (sind sie zu jung, um es zu wissen / sich zu erinnern?) - Ich vermute, dass die Verwendung von \r\nSchreibmaschinen und ähnlichen Geräten stammt.

Wenn Sie mit einer mehrzeiligen Schreibmaschine eine neue Zeile wünschen, müssen zwei physische Aktionen ausgeführt werden: Schieben Sie den Wagen zurück zum Anfang (links in den USA) der Seite und führen Sie das Papier um eine Stufe nach oben .

In den Tagen der Zeilendrucker bestand die einzige Möglichkeit, fett gedruckten Text zu erstellen, beispielsweise darin, einen Wagenrücklauf OHNE neue Zeile durchzuführen und dieselben Zeichen über die alten zu drucken, wodurch mehr Tinte hinzugefügt wurde und dieser dunkler (fett) erscheint. . Wenn die mechanische "Zeilenumbruch" -Funktion in einer Schreibmaschine fehlschlug, war dies das ärgerliche Ergebnis: Sie konnten über die vorherige Textzeile tippen, wenn Sie nicht darauf achteten.

nichts ist notwendig
quelle
3
Der ASCII-Standard für Zeilenumbrüche lautet \ r \ n. (Abgesehen von einer kurzen Pause, als Bell Telephone die Kontrolle über das Normungskomitee erhielt). Als Gegenleistung für das Telefonmonopol gab Bell Telephone das Messaging-Geschäft (Telegramm, Teletyp) auf und kümmerte sich nicht um die bestehende Verwendung des Standards. HTTP, HTML, PCDOS und MSDOS verwendeten den ASCII-Standard. Bell Telephone entschied sich dafür, für Unix nicht dem Standard zu entsprechen, da es kein bestehendes Geschäft gab, mit dem es kompatibel war.
David
12

Zwei verschiedene Zeichen für verschiedene Betriebssysteme. Auch dies spielt eine Rolle bei Datenübertragungen, für TCP/IPdie die Verwendung von erforderlich ist\r\n .

\n Unix

\r Mac

\r\n Windows und DOS.

a432511
quelle
10
Ich denke, Sie verwechseln mit anwendbaren Protokollen, TCP / IP hat keine Ahnung von \ n und \ r.
Jean-Loup
4
TCP / IP erfordert nicht die Verwendung von \ r \ n. Verschiedene auf Telnet basierende Protokolle erfordern dies, einschließlich SMTP, POP3, FTP, HTTP, ...
Marquis of Lorne
9

Fertigstellen,

In einem Shell-Skript (Bash-Skript) können Sie \rden Cursor direkt vor der Zeile senden und natürlich \nden Cursor in eine neue Zeile setzen.

Versuchen Sie zum Beispiel:

echo -en "AA--AA" ; echo -en "BB" ; echo -en "\rBB"
  • Die erste "Echo" -Anzeige AA--AA
  • Der Zweite : AA--AABB
  • Das Letzte : BB--AABB

Vergessen Sie jedoch nicht, -enals Parameter zu verwenden.

Akarun
quelle
5

In Fenstern bewegt sich das \ n zum Anfang der nächsten Zeile. Das \ r bewegt sich zum Anfang der aktuellen Zeile, ohne zur nächsten Zeile zu wechseln. Ich habe \ r in meinen eigenen Konsolen-Apps verwendet, in denen ich Code teste, und ich möchte nicht, dass Text auf meinem Bildschirm nach oben rollt. Verwenden Sie also \ n nicht, nachdem Sie Text ausgedruckt haben, z. B. eine Bildrate ( FPS), ich werde printf ("% - 10d \ r", fps); Dadurch wird der Cursor an den Anfang der Zeile zurückgesetzt, ohne zur nächsten Zeile zu wechseln, und ich kann andere Informationen auf dem Bildschirm anzeigen, die nicht abgescrollt werden, während die Framerate ständig in derselben Zeile aktualisiert wird (% -10 ergibt) Sicher, die Ausgabe besteht aus mindestens 10 Zeichen (linksbündig), sodass sie mit Leerzeichen aufgefüllt wird und alle alten Werte für diese Zeile überschreibt. Es ist ziemlich praktisch für solche Sachen,

Eine kleine Geschichte

Das / r steht für "return" oder "carriage return", was seine Geschichte der Schreibmaschine verdankt. Ein Wagenrücklauf bewegte Ihren Wagen ganz nach rechts, sodass Sie am Anfang der Zeile tippten.

Das / n steht wieder für "neue Zeile", seit Sie mit der Schreibmaschine in eine neue Zeile gewechselt sind. Nicht unbedingt zu Beginn, weshalb einige Betriebssysteme die Notwendigkeit einer A / R-Rückgabe gefolgt von einer / N-Newline übernahmen, da dies die Reihenfolge war, in der eine Schreibmaschine dies tat. Außerdem werden die alten 8-Bit-Computer erläutert, die verwendet wurden "Return" statt "Enter" von "Carriage Return" zu haben, was bekannt war.

Neil Roy
quelle
1

Um die Verwirrung zu vergrößern, habe ich an einem einfachen Texteditor gearbeitet, der ein TextArea-Element in einer HTML-Seite in einem Browser verwendet. In Erwartung von Kompatibilitätsproblemen in Bezug auf CR / LF habe ich den Code geschrieben, um die Plattform zu überprüfen und die für die Plattform geltende Newline-Konvention zu verwenden.

Ich habe jedoch etwas Interessantes entdeckt, als ich die tatsächlichen Zeichen in TextArea über eine kleine JavaScript-Funktion überprüft habe, die die Hex-Daten generiert, die den Zeichen entsprechen.

Für den Test habe ich folgenden Text eingegeben:

Hallo Welt [eintreten]

Auf Wiedersehen, grausame Welt [eintreten]

Als ich die Textdaten untersuchte, erhielt ich folgende Bytefolge:

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

Die meisten Leute, die dies betrachten und 0a, aber keine 0d-Bytes sehen, würden denken, dass diese Ausgabe auf einer Unix / Linux-Plattform erhalten wurde. Aber hier ist das Problem: Diese Sequenz habe ich in Google Chrome unter Windows 7 64-Bit erhalten.

Wenn Sie also ein TextArea-Element verwenden und den Text untersuchen, überprüfen Sie die Ausgabe wie oben beschrieben, um sicherzustellen, welche tatsächlichen Zeichenbytes von Ihrer TextArea zurückgegeben werden. Ich habe noch nicht herausgefunden, ob dies auf anderen Plattformen oder anderen Browsern unterschiedlich ist, aber es lohnt sich zu bedenken, wenn Sie eine Textverarbeitung über JavaScript durchführen und diese Textverarbeitungsplattform unabhängig machen müssen.

Die in den obigen Beiträgen behandelten Konventionen gelten für die Konsolenausgabe , aber HTML-Elemente entsprechen anscheinend der UNIX / Linux-Konvention. Sofern jemand auf einer anderen Plattform / einem anderen Browser nichts anderes entdeckt.

David Edwards
quelle
0
#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();

}

Nehmen wir dieses Beispiel und versuchen Sie, \ n anstelle von \ r zu setzen. Es wird nicht funktionieren. Versuchen Sie zu erraten, warum.

karthik gorijavolu
quelle
1
Dies funktioniert nur, wenn Ihr unterstrichenes Betriebssystem \ r \ n sendet, wenn Sie die EINGABETASTE drücken, z. B. MS DOS, DECS TOPS-10, CP / M, RT-11 usw. In Betriebssystemen wie Multic, Unix und Unix-like ( Linux, Minix usw.) BeOS, RISCOS usw. Die EINGABETASTE sendet Ihnen nur ein \ n Zeichen.
Anders
1
ahh ja die guten alten Zeiten, als Tastaturen beide Returnund hatten Enter. Sogar meine moderne drahtlose Tastatur zeigt immer noch den Abwärts- und Rückwärtspfeil auf der alten ReturnTaste (die jetzt mit "Enter" betitelt ist, um mit der EnterTaste der Zehnertastatur übereinzustimmen , auf der der Pfeil nicht angezeigt wird)
nichts ist
0

Was ist der Unterschied zwischen \ n (Zeilenumbruch) und \ r (Wagenrücklauf)?

Gibt es insbesondere praktische Unterschiede zwischen \nund \r? Gibt es Orte, an denen einer anstelle des anderen verwendet werden sollte?


Ich möchte ein kurzes Experiment mit den jeweiligen Escape-Sequenzen \nfür Newline und \rfür Carriage Return durchführen, um zu veranschaulichen, wo der deutliche Unterschied zwischen ihnen liegt.

Ich weiß, dass diese Frage als sprachunabhängig gestellt wurde. Trotzdem brauchen wir zumindest eine Sprache, um das Experiment zu erfüllen. In meinem Fall habe ich C ++ gewählt, aber das Experiment muss im Allgemeinen in jeder Programmiersprache anwendbar sein.

Das Programm iteriert einfach nur, um einen Satz in die Konsole zu drucken, und zwar durch eine for-Schleifen-Iteration.


Newline-Programm:

#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;
}

Ausgabe:

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

Beachten Sie, dass dieses Ergebnis auf keinem System bereitgestellt wird. Sie führen diesen C ++ - Code aus. Aber es soll für die modernsten Systeme funktionieren. Lesen Sie unten für weitere Details.


Nun, das gleiche Programm, aber mit dem Unterschied, dass \ndurch ersetzt wird \ram Ende der Drucksequenz.

Wagenrücklaufprogramm:

#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;
}

Ausgabe:

7.Walkthrough of the for-loop 

Bemerkt, wo der Unterschied ist? Der Unterschied besteht einfach darin, dass bei Verwendung der Zeilenumbruch-Escape-Sequenz \ram Ende jeder Drucksequenz die nächste Iteration dieser Sequenz nicht in die folgende Textzeile gelangt - am Ende jeder Drucksequenz nicht der Cursor sprang zum * Anfang der nächsten Zeile.

Stattdessen sprang der Cursor zurück zum Anfang der Zeile, an der er sich am Ende befand, bevor er das \rZeichen verwendete. - Das Ergebnis ist, dass jede folgende Iteration der Drucksequenz die vorherige ersetzt.

* Hinweis: A \nSpringen Sie nicht unbedingt an den Anfang der folgenden Textzeile. Bei einigen, im Allgemeinen älteren Betriebssystemen kann das Ergebnis des \nZeilenumbruchs sein, dass er zu einer beliebigen Stelle in der folgenden Zeile springt, nicht nur zum Anfang. Aus diesem Grund müssen sie verwendet werden \r \n, um am Anfang der nächsten Textzeile zu stehen.


Dieses Experiment zeigte uns den Unterschied zwischen Zeilenumbruch und Wagenrücklauf im Zusammenhang mit der Ausgabe der Iteration einer Drucksequenz .

Bei der Erörterung der Eingabe in einem Programm können einige Terminals / Konsolen einen Wagenrücklauf implizit in eine neue Zeile umwandeln, um die Portabilität, Kompatibilität und Integrität zu verbessern.

Wenn Sie jedoch die Wahl haben, eine für eine andere zu wählen oder explizit nur eine bestimmte verwenden möchten oder müssen, sollten Sie immer mit der einen arbeiten, die ihrem Zweck entspricht und streng zwischen diesen unterscheidet.

RobertS unterstützt Monica Cellio
quelle