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

22

Ich denke, \nbewegt die Nadel nach unten und \rbewegt die Nadel an den Anfang einer Linie (linksbündig)? Ich bin mir aber nicht sicher. Also, wenn ich falsch liege, bitte korrigieren Sie mich ....

Jedenfalls wurde mir gesagt, dass Windows und Linux unterschiedlich newlinesund carriage returnsunterschiedlich umgehen . Ich würde gerne wissen, wie sie anders damit umgehen und an welchen Stellen es wichtig ist, sich daran zu erinnern. Danke für die Antwort.

千里 ち ゃ ゃ
quelle
Bisher weiß ich, dass \r\ndas in Windows in Ordnung \n\rist, aber nicht, und ich erinnere mich, dass \r\nes ein Akronym für Registered Nurse ist. Ich habe auch gehört, dass dies unter \nLinux verwendet wird und \rnicht allein für den gleichen Zweck wie \r\n. \rwird in wirklich alten MacOS verwendet. Ich habe diese Fakten jedoch nicht überprüft.
千里 千里 ゃ ん
4
Nennen Sie sie nicht \rund \n, da die \nHandhabung davon abhängt, wo Sie sie verwenden. Besser sie anrufen CRund LF.
Ignacio Vazquez-Abrams
Ignacio, diese Abkürzungen haben für mich keine Bedeutung. Wie nennst du das :/? OH ... LINE FEED und CARRIAGE RETURN. Danke, Sleske.
千里 千里 ゃ ん
@ IgnacioVazquez-Abrams Ist \ n nicht identisch mit LF? Ist in keinem ASCII-Diagramm das Zeichen 13 = \ n = LF?
Barlop
1
@barlop: Nicht in C, wenn unter Windows ausgegeben wird.
Ignacio Vazquez-Abrams

Antworten:

21

Ich denke, \ n bewegt die Nadel nach unten und \ r bewegt die Nadel an den Anfang einer Linie (linksbündig)? Ich bin mir aber nicht sicher

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

Dies funktioniert wahrscheinlich noch auf modernen Druckern, wenn sie im "Textmodus" verwendet werden, ist aber ansonsten heute von geringer Relevanz.

Jedenfalls wurde mir gesagt, dass Windows und Linux anders mit Zeilenumbrüchen und Zeilenumbrüchen umgehen.

Der Unterschied ist einfach: OS-Designer mussten wählen, wie der Anfang einer neuen Zeile in Text in Computerdateien dargestellt werden soll. Aus verschiedenen historischen Gründen wurde in der Unix / Linux-Welt ein einzelnes LF-Zeichen als Zeilenumbruchsmarker ausgewählt. MS-DOS wählte CR + LF und Windows übernahm das. Daher verwenden unterschiedliche Plattformen unterschiedliche Konventionen.

In der Praxis wird dies immer weniger zum Problem. Der Newline-Marker ist eigentlich nur für Pogramme relevant, die "Nur-Text" verarbeiten, und es gibt nicht so viele - er betrifft meist nur Programmquellcode, Konfigurationsdateien und einige einfache Textdateien mit Dokumentation. Heutzutage können die meisten Programme, die diese Art von Dateien verarbeiten (Editoren, Compiler usw.), beide Newline-Konventionen verwenden, sodass es keine Rolle spielt, für welche Sie sich entscheiden.

In einigen Fällen bestehen die Tools auf "ihrer" Newline-Konvention (z. B. Unix-Shell-Skripte dürfen nicht CR + LF verwenden). In diesem Fall müssen Sie die richtige verwenden.

sleske
quelle
Gleiche Fragestellung: Erkennen \n\rund sehen Programmiersprachen \ndas Gleiche? Wenn ich zum Beispiel eine Textdatei analysiere, die auf einem anderen PC bearbeitet wurde und sowohl die Linux- als auch die Windows-Version von Zeilenumbrüchen enthält, würde ich dann ein preg_matchfor ausführen \nund \n\runterschiedliche Ergebnisse erhalten?
千里 千里 ゃ ん
@ 千里 ち ゃ ゃ: Dies hängt vollständig von der Programmiersprache, dem Compiler usw. ab. Insbesondere bei Verwendung von Regexen hängt dies von der verwendeten Regex-Engine ab. Ich glaube).
sleske
@ 千里 ち ゃ ゃ: Wenn Sie eine Frage dazu haben, wie eine Engine für Systeme / Programmiersprachen / reguläre Ausdrücke mit unterschiedlichen Newline-Konventionen umgeht, stellen Sie diese einfach als separate Frage.
sleske
Sie sollten schreiben \ r \ n nicht falsch herum, wie Sie sind. Programmiersprachen können einzelne Zeichen lesen, und Sie als Programmierer können sehen, welche Zeichen in der Eingabe verwendet werden, und Sie als Programmierer können auch tun, was Sie für die Ausgabe wünschen. Genau wie Sie sagen könnten "ABC schreiben, gefolgt von \ r \ r \ r \ n", welche Zeichen Sie am Ende festhalten möchten! Einige andere Zeichen sind möglicherweise nicht druckbar und keine Grafiken oder was auch immer. Sie können einige eingebaute Funktionen wie println haben, und was sie für ihre neue Zeile verwenden, wäre die eine oder andere, es kann nicht beides sein.
Barlop
Mit @ 千里 ち ゃ ゃ und einigen Programmiersprachen können Sie möglicherweise auswählen, welches Ende als Einstellung in einer der eingebauten Funktionen enden soll. Selbst in einer eingebauten Funktion könnten Sie also .. theoretisch sowieso. + Wie bereits erwähnt, können Sie in der Praxis jedes gewünschte Zeilenende schreiben, obwohl Sie dies möglicherweise nicht so effizient tun können wie mit einer println-Funktion.
Barlop
14

CR und LF

Der amerikanische Standardcode für Informationsaustausch (ASCII) definierte Steuerzeichen, einschließlich CARRIAGE-RETURN (CR) und LINE-FEED (LF), die verwendet wurden (und werden), um die Druckposition auf Druckern auf analoge Weise 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 traditionelle Zeilentrennzeichen in Textdateien CR

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

\ n und \ r

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

Bedeutet immer \rdas ASCII-Zeichen CARRIAGE-RETURN (CR), dessen Name tatsächlich von mechanischen Schreibmaschinen stammt, bei denen ein Wagenrücklaufschlüssel vorhanden war, der die Rolle ("Wagen") nach rechts bewegte, angetrieben von einer Feder. so weit es ging. So setzen Sie die aktuelle Tippposition auf den linken Rand.

Programmierung

In einigen Programmiersprachen \nkann dies eine plattformabhängige Folge von Zeichen bedeuten, die Zeilen in einer Textdatei beenden oder trennen. print "\n"Erzeugt beispielsweise in Perl unter Linux eine andere Zeichenfolge als unter Windows.

In Java ist die beste Vorgehensweise, wenn Sie die nativen Zeilenenden für die Laufzeitplattform verwenden möchten, nicht \noder \rüberhaupt nicht zu verwenden . Sie sollten verwenden System.getProperty("line.separator"). Sie sollten \nund \rwo Sie möchten LF und CR unabhängig von der Plattform verwenden (z. B. wie in HTTP, FTP und anderen Internet-Kommunikationsprotokollen verwendet).

Unix stty

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

Linux und OSX folgen den Unix-Konventionen

Textdateien

Textdateien sind nach wie vor enorm wichtig und weit verbreitet. Beispielsweise sind HTML und XML Beispiele für Textdateien. Die meisten wichtigen Internetprotokolle, wie z. B. HTTP, folgen den Konventionen für Textdateien und enthalten Spezifikationen für Zeilenenden.

Drucker

Die meisten anderen als die billigsten Drucker respektieren immer noch CR und LF. Tatsächlich sind sie für die am häufigsten verwendeten Seitenbeschreibungssprachen - PCL und Postscript - von grundlegender Bedeutung.

RedGrittyBrick
quelle
1
Hinweis zu Java: Es ist im Allgemeinen nicht wahr, dass Sie "\ n oder \ r überhaupt nicht verwenden" sollten. Es ist nur so, dass in Java "\ n" immer LF und "\ r" immer CR ist. Dies kann genau das sein, was Sie möchten: Wenn Sie einen bestimmten Zeilenendestil möchten, verwenden Sie diesen. wenn Sie explizit die native Zeilenende des Computers möchten Sie laufen auf, dann verwenden line.separator. Es kommt wirklich darauf an, was Sie wollen.
sleske
Und BTW, wird println()automatisch verwendet line.separator. Wenn Sie also native Zeilenenden möchten, können Sie diese verwenden println()(und wenn Sie eine bestimmte Art von Zeilenende benötigen, verwenden Sie diese nicht, sondern verwenden Sie explizit "\ n" usw.).
sleske
@sleske: Gute Punkte. Ich werde meine Antwort entsprechend aktualisieren.
RedGrittyBrick
1
Gibt es Sprachen oder Compiler, bei denen \nes sich nicht um ASCII-LF-Steuerzeichen handelt (ausgenommen EBCDIC-basierte Systeme)? Ich beziehe mich auf das, was \nin einem Zeichenketten- oder Zeichenliteral bedeutet, nicht auf den Effekt des Sendens an eine Datei oder ein Ausgabegerät.
Keith Thompson
1
@KeithThompson: Für Java: Ja, \nist immer ASCII (und Unicode) Code 10, weil das JLS dies explizit sagt (JLS 3.10.6, "Escape Sequences for Character and String Literals" - ich habe es überprüft :-)). Für andere Sprachen - gute Frage.
sleske
4

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, sowohl CR als auch LF zu machen, \r\nund in den meisten Fällen wird dies gut funktionieren.

James Billingham
quelle
Ignoriert Linux das \roder führt es zu einer Verhaltensänderung?
Aaron Franke