Wie werden \ n und \ r unter Linux und Windows unterschiedlich behandelt?

77069
千里ちゃん

Ich denke, \nbewegt die Nadel nach unten und \rdie Nadel an den Anfang einer Linie (nach links ausgerichtet)? Ich bin mir jedoch nicht sicher. Wenn ich mich irre, korrigieren Sie mich bitte ....

Jedenfalls wurde mir gesagt, dass Windows und Linux newlinesund carriage returnsanders umgehen . Ich würde gerne wissen, wie sie anders damit umgehen und an einigen Stellen, an die man sich erinnern muss. Danke für die Antwort.

17
Bisher weiß ich, dass "\ r \ n" in Windows in Ordnung ist, aber "\ n \ r" nicht, und ich erinnere mich daran, weil "\ r \ n" ein Akronym für registrierte Krankenschwester ist. Ich höre auch, dass "\ n" von Leuten in Linux verwendet wird und "\ r" nicht für denselben Zweck wie "\ r \ n" verwendet wird. `\ r` wird in wirklich alten MacOS verwendet. Ich habe diese Fakten jedoch nicht bestätigt. 千里ちゃん vor 12 Jahren 0
Nennen Sie sie nicht "\ r" und "\ n", da die Handhabung von "\ n" davon abhängt, wo Sie sie verwenden. Nennen Sie sie besser "CR" und "LF". Ignacio Vazquez-Abrams vor 12 Jahren 3
Ignacio, diese Abkürzungen haben für mich keine Bedeutung. Wie nennst du das :/? OH ... LINE FEED und Transport zurück. Danke, Sleske. 千里ちゃん vor 12 Jahren 0
@ IgnacioVazquez-Abrams Ist \ n nicht identisch mit LF? Ist in einem ASCII-Diagramm nicht das Zeichen 13 = \ n = LF? barlop vor 12 Jahren 0
@ barlop: Nicht in C bei der Ausgabe in Windows. Ignacio Vazquez-Abrams vor 12 Jahren 1
@ IgnacioVazquez-Abrams C schreibt die ASCII-Tabelle jedoch nicht neu. Ich bin damit einverstanden, dass \ n möglicherweise nicht als Zeilenvorschub fungiert. Dies bedeutet jedoch nicht, dass es nicht das Zeichen LF ist. (mehr von einer Frage, da ich weiß, dass Sie mehr als ich wissen) barlop vor 12 Jahren 0
@ IgnacioVazquez-Abrams \ n steht wahrscheinlich für neue Zeile. dh LF. Wie sie sich verhalten, ist eine andere Sache. In Unix ist \ n oder LF ohnehin nicht nur ein Zeilenvorschub, sondern auch eine Wagenrücklauffunktion, wird aber trotzdem als Zeilenvorschubzeichen bezeichnet. barlop vor 12 Jahren 0
@ barlop: Um vollkommen fair zu sein, hat `\ n` außerhalb von C (und anderen Programmiersprachen, die es interpretieren) keine wirkliche Bedeutung. Die Zeichenfolge "\ n" würde nicht einmal * bedeuten * wenn nicht für C. Ignacio Vazquez-Abrams vor 12 Jahren 0

3 Antworten auf die Frage

16
sleske

Ich denke, \ n bewegt die Nadel nach unten und \ r bewegt die Nadel an den Anfang einer Linie (linke Ausrichtung). Ich bin mir jedoch nicht sicher

Das ist mehr oder weniger wahr, aber meistens eine historische Kuriosität. Ursprünglich wurde Zeilenvorschub (LF) verwendet, um das Papier auf Druckern und Hardcopy-Terminals ( Teleprintern ) um eine Zeile vorzurücken . Wagenrücklauf (CR) brachte den Druckkopf an den Zeilenanfang zurück.

Dies funktioniert auf modernen Druckern wahrscheinlich immer noch, wenn es im "Textmodus" verwendet wird, ist aber ansonsten heute wenig relevant.

Jedenfalls wurde mir gesagt, dass Windows und Linux mit Zeilenumbrüchen und Wagenrückläufen unterschiedlich umgehen.

Der Unterschied ist einfach: Betriebssystemdesigner mussten auswählen, wie der Beginn einer neuen Textzeile in Computerdateien dargestellt wird. Aus verschiedenen historischen Gründen wurde in der Unix / Linux-Welt ein einzelner LF-Charakter als Newline-Marker gewählt. MS-DOS wählte CR + LF und Windows übernahm dies. Daher verwenden unterschiedliche Plattformen unterschiedliche Konventionen.

In der Praxis wird dies immer weniger zum Problem. Die Newline-Markierung ist eigentlich nur für Pogramme relevant, die "Klartext" verarbeiten, und es gibt nicht viele davon - sie betreffen meist nur Quellcode, Konfigurationsdateien und einige einfache Textdateien mit Dokumentation. Heutzutage können die meisten Programme, die mit diesen Arten von Dateien umgehen (Editoren, Compiler usw.), beide Zeilenumbrüche handhaben. Daher ist es egal, für welche Datei Sie sich entscheiden.

Es gibt Fälle, in denen Werkzeuge auf "ihrer" Newline-Konvention bestehen (z. B. dürfen Unix-Shell-Skripts nicht CR + LF verwenden). In diesem Fall müssen Sie die richtige verwenden.

Gleiche Fragezeile: Erkennen Programmiersprachen `\ n \ r` und` \ n` als gleich? Wenn ich zum Beispiel eine Textdatei parsen würde, die auf dem Computer eines anderen Benutzers bearbeitet wurde und sowohl die Linux- als auch die Windows-Version von Zeilenumbrüchen enthielt, würde ich ein `preg_match` für` \ n` und `\ n \ r` ausführen, was mich anders aussehen würde Ergebnisse? 千里ちゃん vor 12 Jahren 0
@ 千里 ち ゃ ん: Dies hängt völlig von der Programmiersprache, dem Compiler usw. ab. Insbesondere wenn Sie reguläre Ausdrücke verwenden, hängt es von der verwendeten Regex-Engine ab - einige unterscheiden sich zwischen den Zeilenenden, andere nicht (die meisten können so Ich glaube). sleske vor 12 Jahren 0
@ 千里 ち ゃ ん: Wenn Sie eine Frage dazu haben, wie eine System- / Programmiersprache / reguläre Ausdrücke-Engine verschiedene Newline-Konventionen behandelt, stellen Sie dies einfach als separate Frage. sleske vor 12 Jahren 0
Sie sollten \ r \ n nicht so falsch schreiben wie Sie. In Bezug auf die Programmiersprachen können sie einzelne Zeichen lesen und Sie können sehen, welcher Programmierer in der Eingabe verwendet wird, und Sie können den Programmierer auch nach Belieben für die Ausgabe verwenden. So wie Sie sagen könnten "Schreiben Sie ABC gefolgt von \ r \ r \ r \ n", welche Zeichen Sie am Ende halten möchten! Einige andere Zeichen sind möglicherweise nicht druckbar und auch keine grafischen Darstellungen. Sie haben möglicherweise einige eingebaute Funktionen wie println, und was sie für ihre neue Zeile verwenden, wäre die eine oder die andere, es können nicht beides sein. barlop vor 12 Jahren 0
@ 千里 ち ゃ ん und einige Programmiersprachen können Sie wählen lassen, welches Ende in einer ihrer eingebauten Funktionen enden soll, so dass Sie selbst in einer eingebauten Funktion theoretisch sowieso .. + Wie bereits erwähnt, können Sie in der Praxis die Zeilenenden schreiben, die Sie möchten ... obwohl Sie dies möglicherweise nicht so effizient wie mit einer println-Funktion tun können. barlop vor 12 Jahren 0
Abgesehen von regulären Ausdrücken werden die meisten Programmierumgebungen, mit denen ich arbeite (und vermutlich die meisten gesunden Programmierumgebungen), dieses Problem automatisch lösen. Verwenden Sie immer "\ n" für sich alleine und entweder LF oder CRLF wird ausgegeben, je nachdem, was in der aktuellen Umgebung korrekt ist (oder, LFCR, wenn Sie etwas verrücktes Sun haben). Die Verwendung von "\ r \ n" in Programmen ist die schlechtere Idee, denn unter den mir bekannten Compilern würde dies zu CRLF in * nix (bad) und CRCRLF unter Windows (bad) führen. Java ist die einzige Ausnahme, die ich kenne (und ich erinnerte mich nur daran, dass ich einen anderen Kommentar gelesen habe, der sich auf diese Frage bezieht). jcrawfordor vor 12 Jahren 0
Ich habe ein Problem mit Chrome-Entwicklertools, Debugging und Haltepunkten (https://code.google.com/p/v8/issues/detail?id=2825#c33) untersucht. Ich denke, es hängt mit der Art der Zeilenumbrüche zusammen wird von Chrome Dev Tools gehandhabt und wie Linux (Git in diesem Fall) sie normalisiert. seangwright vor 9 Jahren 0
11
RedGrittyBrick

CR und LF

Der amerikanische Standardcode für den Informationsaustausch (ASCII) definierte Steuerzeichen, einschließlich CARRIAGE-RETURN (CR) und LINE-FEED (LF), die verwendet wurden (und werden), um die Druckposition auf Druckern analog zu steuern mechanische Schreibmaschinen, die früheren Computerdruckern vorausgingen.

Plattformabhängigkeit

In Windows ist das traditionelle Zeilentrennzeichen in Textdateien CR, gefolgt von LF

In alten (vor OSX) Apple Macintosh-Systemen war das herkömmliche Trennzeichen in Textdateien CR

In Unix und Linux ist das traditionelle Trennzeichen in Textdateien LF.

\ n und \ r

In vielen Programmier- und Skriptsprachen \nbedeutet dies "neue Zeile". Manchmal (aber nicht immer) bedeutet dies das ASCII LINE-FEED-Zeichen (LF), das, wie Sie sagen, den Cursor (oder die Druckposition) eine Zeile nach unten bewegt. In einem Drucker oder einer Schreibmaschine würde dies das Papier tatsächlich um eine Zeile nach oben verschieben.

Bedeutet ausnahmslos \rdas ASCII CARRIAGE-RETURN-Zeichen (CR), dessen Name eigentlich von mechanischen Schreibmaschinen stammt, bei denen es einen Wagenrücklaufschlüssel gab, durch den die Rolle ("Wagen"), die das Papier beförderte, durch eine Feder nach rechts bewegt wurde. soweit es gehen würde. Damit wird die aktuelle Schreibposition am linken Rand eingestellt.

Programmierung

In einigen Programmiersprachen \nkann eine plattformabhängige Folge von Zeichen bedeuten, die Zeilen in einer Textdatei enden oder voneinander trennen. In Perl zum Beispiel wird unter print "\n"Linux eine andere Zeichenfolge als unter Windows erzeugt.

In Java ist es am besten, wenn Sie die systemeigenen Zeilenenden für die Laufzeitplattform verwenden möchten \noder nicht \r. Sie sollten verwenden System.getProperty("line.separator"). Sie sollten verwenden \nund \rwo Sie LF und CR wollen unabhängig von der Plattform (zB wie in HTTP, FTP und anderen Internet - Kommunikationsprotokollen verwendet).

Unix Stty

In einer Unix-Shell kann der sttyBefehl dazu verwendet werden, die Shell zwischen diesen verschiedenen Konventionen zu übersetzen. Zum Beispiel stty -onlcrwird die Shell veranlassen, alle ausgehenden LFs anschließend in CR LF zu übersetzen.

Linux und OSX folgen den Unix-Konventionen

Textdateien

Textdateien sind nach wie vor enorm wichtig und werden häufig verwendet. Beispielsweise sind HTML und XML Beispiele für Textdateien. Die meisten wichtigen Internetprotokolle, wie z. B. HTTP, folgen den Konventionen von Textdateien und enthalten Spezifikationen für Zeilenenden.

Drucker

Bei den meisten Druckern, abgesehen von den günstigsten Druckern, wird CR und LF immer noch beachtet. In der Tat sind sie grundlegend für die am häufigsten verwendeten Seitenbeschreibungssprachen - PCL und Postscript.

Hinweis zu Java: Im Allgemeinen ist es nicht richtig, dass Sie "\ n oder \ r überhaupt nicht verwenden". Es ist nur so, dass in Java "\ n" immer LF ist und "\ r" immer CR ist. Dies * ist * vielleicht genau das, was Sie wollen: Wenn Sie einen bestimmten Stil für den Zeilenende wünschen, verwenden Sie sie. Wenn Sie explizit das native Zeilenende des Computers wünschen, auf dem Sie laufen, verwenden Sie * line.separator. Es hängt wirklich davon ab, was Sie wollen. sleske vor 12 Jahren 1
Übrigens verwendet `println ()` automatisch `line.separator`. Wenn Sie native Zeilenenden wünschen, können Sie` println () `verwenden (und wenn Sie eine bestimmte Art von Zeilenende benötigen, dann nicht verwenden.) aber verwenden Sie "\ n" usw. explizit). sleske vor 12 Jahren 0
@sleske: Gute Punkte. Ich werde meine Antwort entsprechend aktualisieren. RedGrittyBrick vor 12 Jahren 0
Gibt es Sprachen oder Compiler, bei denen `\ n ein anderes Steuerzeichen als ASCII LF ist (andere als EBCDIC-basierte Systeme)? Ich beziehe mich darauf, was "\ n" in einem String- oder Zeichenliteral bedeutet, nicht auf den Effekt, wenn es an eine Datei oder ein Ausgabegerät gesendet wird. Keith Thompson vor 12 Jahren 1
@KeithThompson: Laut [Wikipedia] (http://en.wikipedia.org/wiki/Newline#In_programming_languages) Der C-Standard ermöglicht, dass \ n durch einen einzelnen Zeichenwert dargestellt wird. RedGrittyBrick vor 12 Jahren 0
@RedGrittyBrick: Mit einigen Einschränkungen (zum Beispiel muss es eindeutig sein). Aber meine Frage war nach Implementierungen, nicht nach dem Standard. Ein vor OSX MacOS C * erstellter Compiler * könnte beispielsweise '' \ n '' gleich CR sein, aber '' \ r '' müsste etwas anderes sein (LF?). Ist '' \ n '== 10' 'universell für Nicht-EBCDIC-Systeme gültig? (Sicherlich sollte gut geschriebener Code davon nicht ausgehen.) Keith Thompson vor 12 Jahren 0
@KeithThompson: Für Java: Ja, "\ n" ist immer ASCII- (und Unicode-) Code 10, weil die JLS dies ausdrücklich sagt (JLS 3.10.6, "Escape-Sequenzen für Zeichen- und Zeichenkettenliterale" - ich habe geprüft :-)) . Für andere Sprachen - gute Frage. sleske vor 12 Jahren 1
@ KeithThompson: Betrachten Sie dies als separate Frage zu SO. Es ist ein interessantes Problem. sleske vor 12 Jahren 0
3
James Billingham

Kurz gesagt, wurde für Drucker benötigt, aber jetzt machen es die Betriebssysteme etwas anders. In den meisten Fällen ist es in Ordnung, CR und LF einfach zu tun, \r\nund in den meisten Fällen wird dies problemlos funktionieren.