Was ist der Unterschied zwischen \n
(Zeilenumbruch) und \r
(Wagenrücklauf)?
Gibt es insbesondere praktische Unterschiede zwischen \n
und \r
? Gibt es Orte, an denen einer anstelle des anderen verwendet werden sollte?
Was ist der Unterschied zwischen \n
(Zeilenumbruch) und \r
(Wagenrücklauf)?
Gibt es insbesondere praktische Unterschiede zwischen \n
und \r
? Gibt es Orte, an denen einer anstelle des anderen verwendet werden sollte?
Antworten:
In Bezug auf ASCII-Code ist es 3 - da sie 10 bzw. 13 sind ;-).
Aber im Ernst, es gibt viele:
\n
der Code für das Zeilenende \r
nichts Besonderes\n
die Standard-Escape-Sequenz für das Zeilenende (nach Bedarf in / aus betriebssystemspezifischen Sequenzen übersetzt).\r
war stattdessen der Code für das Zeilenende\r\n
in dieser Reihenfolge\r\n
ist die Standard-Zeilenbeendigung für Textformate im Internet\r
der Schlitten angewiesen, nach links zurückzufahren, bis er den Anschlag ganz links erreicht (langsame Operation), \n
und 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 .\r
und \n
wirkt 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 \r
ist, 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 ;-).
\0
) hinzugefügt \n
, um das Extra zuzulassen Zeit. Dies wurde vom Betriebssystem transparent gehandhabt, sodass Sie im Legacy-Code keine Spuren davon finden.
\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 \n
oder \r
in dem Sinne sichtbar sind , dass zum Beispiel a
, .
, (
etc. sind Zeichen.
In der Vergangenheit \n
wurde a verwendet, um den Wagen nach unten zu bewegen, während a \r
verwendet wurde, um den Wagen zurück auf die linke Seite der Seite zu bewegen.
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
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.
\r
Auf einem Mac war es lange nicht mehr das Zeilenende. Mit der Veröffentlichung von Mac OS X im Jahr 2001 (das auf Unix basiert) \n
wird nun verwendet.
\r
MS Office 2011 Excel verwenden: Speichern einer CSV (mit allen Standardeinstellungen), um eine ISO-8859-1-codierte Datei mit \r
-line-Endungen zu speichern .
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\n
Schreibmaschinen 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.
Zwei verschiedene Zeichen für verschiedene Betriebssysteme. Auch dies spielt eine Rolle bei Datenübertragungen, für TCP/IP
die die Verwendung von erforderlich ist\r\n
.
\n
Unix
\r
Mac
\r\n
Windows und DOS.
Fertigstellen,
In einem Shell-Skript (Bash-Skript) können Sie \r
den Cursor direkt vor der Zeile senden und natürlich \n
den Cursor in eine neue Zeile setzen.
Versuchen Sie zum Beispiel:
echo -en "AA--AA" ; echo -en "BB" ; echo -en "\rBB"
AA--AA
AA--AABB
BB--AABB
Vergessen Sie jedoch nicht, -en
als Parameter zu verwenden.
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.
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.
#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.
Return
und hatten Enter
. Sogar meine moderne drahtlose Tastatur zeigt immer noch den Abwärts- und Rückwärtspfeil auf der alten Return
Taste (die jetzt mit "Enter" betitelt ist, um mit der Enter
Taste der Zehnertastatur übereinzustimmen , auf der der Pfeil nicht angezeigt wird)
Was ist der Unterschied zwischen \ n (Zeilenumbruch) und \ r (Wagenrücklauf)?
Gibt es insbesondere praktische Unterschiede zwischen
\n
und\r
? Gibt es Orte, an denen einer anstelle des anderen verwendet werden sollte?
Ich möchte ein kurzes Experiment mit den jeweiligen Escape-Sequenzen \n
für Newline und \r
fü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 \n
durch ersetzt wird \r
am 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 \r
am 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 \r
Zeichen verwendete. - Das Ergebnis ist, dass jede folgende Iteration der Drucksequenz die vorherige ersetzt.
* Hinweis: A \n
Springen Sie nicht unbedingt an den Anfang der folgenden Textzeile. Bei einigen, im Allgemeinen älteren Betriebssystemen kann das Ergebnis des \n
Zeilenumbruchs 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.