Erinnerung - \ r \ n oder \ n \ r?


390

Ich kann mich einfach nicht daran erinnern. Was ist also der richtige Weg, um altmodische ASCII-Leitungen ordnungsgemäß zu beenden?


11
Wenn Sie dies tun, stellen Sie sicher, dass Sie Ihre Dateien im Binärmodus öffnen . Andernfalls konvertieren die Standard-C / C ++ - Dateistreams das "\ n" (für Textdateien (Standardeinstellung)) in eine plattformspezifische End-of-Line-Sequenz (ELS). Daher wird "\ r \ n" unter Windows auf der physischen Festplatte in "\ r \ r \ n" konvertiert. Hinweis: Wenn Sie nur C / C ++ zum Zurücklesen der Datei verwenden, werden Sie dies nicht bemerken, da der ELS beim Lesen aus der Datei wieder in "\ n" konvertiert wird.
Martin York

@Martin - Ich bin in .net und verwende (für dieses Beispiel) File.AppendAllText mit "\ r \ n". Ich habe mir gerade eine Datei angesehen und am Ende von gibt es keine \ r Duplizierung die Linie. Magie?
Daniel Mošmondor

@ Daniel: Ich hätte genauer sein sollen. Die C / C ++ - Streams. Wenn mit einer Datei verknüpft und im Textmodus geöffnet . Dies hängt auch davon ab, wie Sie die Datei betrachten (verwenden Sie einen Hexeditor).
Martin York

@ Martin - verwendet PSPad im Hex-Modus ...
Daniel Mošmondor

1
Bei alten Tastaturen wurde die Eingabetaste als Eingabetaste bezeichnet. Also kam zuerst die Rückgabe, dann wurde der Linefeed als Antwort generiert. Es ist alles so offensichtlich, wenn Sie viel zu viel Geschichte haben.
Mark Ransom

Antworten:


1084

Ich würde das Wort ' r etur n ' verwenden, um mich zu erinnern, das r kommt vor dem n.


116
Und um sich daran zu erinnern, dass das zu verwendende Wort return ist , denken Sie daran, dass \ r der Wagenrücklauf ist . Denken Sie nicht daran, dass "Return" der Name der Taste auf Mac-Tastaturen ist. Andernfalls können Sie später auf eine PC-Tastatur schauen, die Taste "Enter" sehen und die Buchstabenreihenfolge falsch eingeben.
Rob Kennedy

3
@ David Aber ich habe mich gefragt, ob \n\rund \r\nist der gleiche Effekt , machen sie nicht den gleichen Effekt? Kannst du den Unterschied erkennen?
Mr. Anubis

7
@ Mr.Anubis Wenn Sie einen bestimmten Nadeldrucker haben, sollte es keinen Unterschied geben, da die Reihenfolge der Befehle nicht wichtig sein sollte. Bei einigen Druckern erhalten Sie jedoch eine zusätzliche Leerzeile oder gar keine Zeilenvorschub. Und alles, was oben gesagt wurde, gilt für Texteditoren - sie werden verwirrt sein, TextStream-Klassen werden krank und so weiter. Bestellen IST wichtig. :)
Daniel Mošmondor

12
@ DanielMošmondor Alternativ können Sie sich auch daran erinnern, dass die Reihenfolge nicht korrekt ist. Oder dass, als Sie bei SO gefragt haben, Ihnen jemand einen RemiNder gegeben hat, den Sie später vergessen haben. Oder dass Sie nicht Ihren Familiennamen als Erinnerung verwenden, da die Reihenfolge von r und n dort umkehrt :)
Daniel Daranas

5
@RobKennedy haha ​​du weißt, ich bin hierher gekommen und habe über die Rückkehr gelesen und dachte "großartig!". Dann habe ich deinen Kommentar gelesen. Jetzt kann ich mich jedes Mal nicht erinnern, welchen Schlüssel ich nicht sehen sollte - ich schaue auf meinen "Enter" -Schlüssel und denke, "hier stimmt etwas nicht" ... haha, wenn ich darüber nachdenke!
Wayne Uroda

53

Wenn Sie C # verwenden, sollten Sie Folgendes verwenden Environment.NewLine: Laut MSDN ist dies:

Eine Zeichenfolge mit "\ r \ n" für Nicht-Unix-Plattformen oder eine Zeichenfolge mit "\ n" für Unix-Plattformen.


46
Eigentlich hängt diese Art davon ab, was Sie tun. Wenn Sie nur einfachen Text an die Konsole oder in eine Datei zur lokalen Verwendung ausgeben, Environment.NewLineist dies in Ordnung. Wenn Sie jedoch Dinge in einem genau definierten Format schreiben, definiert das Format möglicherweise auch die neue Zeile. So heißt es in dem HTTP - Protokoll Sie müssen verwenden \r\nals Leitungsabschluss für Header usw., unabhängig von der Plattform.
Matti Virkkunen

3
Ja, das ist wirklich ein schlechter Rat.
IvanP

Aus diesem Grund müssen Sie Ihre Webnachrichten maskieren und Komponententests erstellen, um zu überprüfen, ob das Senden von \ r \ n (Windows), \ r (Mac), \ n (Linux) ordnungsgemäß als \ r \ n an den Webserver gesendet wird.
TamusJRoyce

37

Die neue Zeile hängt von Ihrem Betriebssystem ab:

DOS & Windows: \r\n 0D0A (hex), 13,10 (decimal)
Unix & Mac OS X: \n, 0A, 10
Macintosh (OS 9): \r, 0D, 13

Weitere Details hier: https://ccrma.stanford.edu/~craig/utility/flip/

Verwenden Sie im Zweifelsfall einen beliebigen Freeware-Hex-Viewer / -Editor, um zu sehen, wie eine Datei ihre neue Zeile codiert.

Für mich, ich benutze Leitfaden zu Hilfe folgende erinnere mich: 0D0A = \ r \ n = CR, LF = ca rr iAge r eturn, li n e - Feed


7
Seltsamerweise bin ich einer dieser Menschen, die es 0D0Aauswendig wissen , aber dennoch das \rund verwirren \n.
Nyerguds

1
Oder ich erinnere mich, dass \ r Wagenrücklauf und \ n Zeilenvorschub ist ... ich erinnere mich nur nicht an ihre Reihenfolge, daher hilft es nicht, sich daran zu erinnern, welches 0D und welches 0A ist;)
Nyerguds

20

Die Sequenz ist CR (Wagenrücklauf) - LF (Zeilenvorschub). Erinnern Sie sich an Nadeldrucker? Genau. Also - die richtige Reihenfolge ist \ r \ n


Ich denke, das ist die logischste Antwort
David Snabel-Caunt

12
LF + CR würde auf Druckern dasselbe CR + LF ausführen.
Ikegami

10
Ich bin anderer Meinung, @David. Es reicht nicht aus, nur an Nadeldrucker (oder Schreibmaschinen) zu denken, da diese einen Wagen zurückgeben müssen. Mit nur grundlegenden Informationen über ihre Funktionsweise gibt es keinen Grund zu der Annahme, dass es wichtig ist, ob wir das Papier vor oder nach der Rückkehr zum Zeilenanfang vorschieben. Sowohl \ r \ n als auch \ n \ r bringen das Papier in die gleiche Position.
Rob Kennedy

@ikegami auf den meisten Druckern, nicht auf allen. Sie hatten auch DIP-Schalter, um dieses Verhalten zu konfigurieren. :)
Daniel Mošmondor

5
Ein Grund für das Einlegen des Zeilenvorschubs nach dem Wagenrücklauf besteht darin, dass weniger Zeit benötigt wird. Während der Kopf zum linken Rand des Papiers zurückkehrt, kann die Walze eine Zeile indizieren. Die längere Operation beginnt zuerst, sodass die gesamte Operation in der Zeit abgeschlossen ist, die für die Ausführung der längeren Operation erforderlich ist. Wir haben damals aus solchen Gründen viele Dinge getan; Stellen Sie sich vor, Sie warten ein paar hundert Zeilen mit 110 Baud ab ...
Jerry Andrews

8

In jeder .NET-Sprache Environment.NewLinewäre dies vorzuziehen.


Funktioniert nicht für konstante Zeichenfolgen. Bei Bedarf ist es besser, keine Konstante zu verwenden und stattdessen eine statische Zeichenfolge zu verwenden;)
TamusJRoyce

5

Seien Sie vorsichtig, wenn Sie dies manuell tun.
In der Tat würde ich raten , dies überhaupt nicht zu tun.

In Wirklichkeit handelt es sich um die plattformspezifische Leitungsabschlusssequenz LTS.

Wenn Sie eine Datei im Textmodus öffnen (dh nicht binär), konvertieren die Streams das "\ n" in das richtige LTS für Ihre Plattform. Konvertieren Sie dann die LTS zurück in "\ n", wenn Sie die Datei lesen.

Wenn Sie "\ r \ n" in eine Windows-Datei drucken, erhalten Sie die Sequenz "\ r \ r \ n" in der physischen Datei (schauen Sie mit einem Hex-Editor nach).

Dies ist natürlich ein echtes Problem beim Übertragen von Dateien zwischen Plattformen.

Wenn Sie jetzt in einen Netzwerk-Stream schreiben, würde ich dies manuell tun (da die meisten Netzwerkprotokolle dies speziell ausrufen). Aber ich würde sicherstellen, dass der Stream keine Interpretation ausführt (daher war der Binärmodus angemessen).


4

\r\n für Windows wird gut tun.


Eine Single \nfunktioniert auch unter Windows, einschließlich der neuesten Version von Notepad.
André Caron

Ich denke, moderne Editoren erkennen Zeilenenden, da unterschiedliche Betriebssysteme unterschiedliche Endungen verwenden.
David Snabel-Caunt

1
Eigentlich nicht: Wenn Sie dies unter Windows in eine Datei drucken (Standard-C / C ++ - Datei im Textmodus geöffnet), enthält die physische Datei "\ r \ r \ n" (überprüfen Sie dies mit einem Hex-Editor). Wenn Sie es zurücklesen, wird "\ r \ n" wieder in ein einzelnes "\ n" umgewandelt.
Martin York

2
Eigentlich, @DavidCaunt, habe ich es gerade versucht \ n und es funktioniert nicht mit Notepad unter Win8.
Philk

4

Aus Wikipedia (Sie können in diesem Artikel lesen, welches für Ihr Betriebssystem korrekt ist):

Systeme, die auf ASCII oder einem kompatiblen Zeichensatz basieren, verwenden entweder LF (Zeilenvorschub, '\ n', 0x0A, 10 in Dezimalzahl) oder CR (Wagenrücklauf, '\ r', 0x0D, 13 in Dezimalzahl) einzeln oder CR gefolgt von CR LF (CR + LF, '\ r \ n', 0x0D0A).


3

\r\n

Seltsamerweise erinnere ich mich daran, weil es das Gegenteil der Schreibmaschine ist, die ich benutzt habe.
Nun, wenn es normal war, musste ich mich nicht daran erinnern ...:-)

Schreibmaschine aus Wikipedia * Bild aus Wikipedia

Wenn Sie mit dem Ziffern der Linie fertig sind, verwenden Sie in der Schreibmaschine den Wagenrücklaufhebel , mit dem Sie die Trommel und die neue Linie rollen lassen und anschließend den Wagenrücklauf manuell bedienen können .

Sie können von dieser Aufnahme auf freesound.org den Ton des Papiereinzugs am Anfang und etwa -1: 03 Sekunden nach dem Ende nach der Glockenwarnung für das Ende des Line-Sounds der Trommel, die rollt und danach, anhören der der Wagenrücklauf.


2

Wenn Sie C # verwenden, warum nicht Environment.NewLine? (Ich nehme an, Sie verwenden einige File-Writer-Objekte ... übergeben Sie Environment.NewLinees einfach und es werden die richtigen Terminatoren behandelt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.