Przypomnienie - \ r \ n czy \ n \ r?

390

Po prostu ich nie pamiętam. Więc jaki jest właściwy sposób prawidłowego zakończenia starych linii ASCII?

Daniel Mošmondor
źródło
11
Jeśli to zrobisz, upewnij się, że otwierasz pliki w trybie binarnym . W przeciwnym razie standardowe strumienie plików C / C ++ przekonwertują „\ n” (dla plików tekstowych (domyślnie)) na specyficzną dla platformy sekwencję końca linii (ELS). W ten sposób „\ r \ n” w systemie Windows zostanie przekonwertowany na „\ r \ r \ n” na dysku fizycznym. Uwaga: jeśli użyjesz C / C ++ do odczytania pliku, nie zauważysz, że ELS zostanie ponownie przekonwertowany na „\ n” po odczytaniu z pliku.
Martin York,
@Martin - korzystam z .net i używam (w tym przykładzie) File.AppendAllText z „\ r \ n”, po prostu rzuciłem okiem na plik i nie ma duplikacji na końcu linia. Magia?
Daniel Mošmondor
@Daniel: Powinienem był być bardziej szczegółowy. C / C ++ strumieni. Po skojarzeniu z plikiem i otwarciu w trybie tekstowym . Zależy to również od tego, jak spojrzysz na plik (użyj heksitora).
Martin York
@Martin - używał PSPad w trybie szesnastkowym ...
Daniel Mošmondor
1
Na starożytnych klawiaturach klawisz Enter nazywał się klawiszem Return. Tak więc powrót pojawił się jako pierwszy, a następnie w odpowiedzi wygenerowano podawanie liniowe. To wszystko jest tak oczywiste, gdy masz za dużo historii.
Mark Ransom

Odpowiedzi:

1084

Użyłbym słowa „ r etur n ”, aby pamiętać, że r występuje przed n.

David Snabel-Caunt
źródło
116
I aby pamiętać, że słowem, które należy użyć, jest return , pamiętaj, że \ r to return return . Nie pamiętaj, że „Return” to nazwa klawisza na klawiaturze komputera Mac. W przeciwnym razie możesz później spojrzeć na klawiaturę komputera, zobaczyć klawisz o nazwie „Enter” i pomylić kolejność liter!
Rob Kennedy
3
@David Ale zastanawiałem się, że efekt \n\ri \r\nto samo, nie robią ten sam efekt? Czy dostrzegasz różnicę?
Mr.Anubis
7
@ Mr.Anubis, jeśli masz pewną drukarkę igłową, nie powinno być ŻADNEJ różnicy, ponieważ kolejność poleceń nie powinna być ważna. Jednak w przypadku niektórych drukarek dostaniesz dodatkową pustą linię lub jej brak. I wszystko, co powiedziano powyżej, dotyczy edytorów tekstu - będą pomieszane, klasy TextStream zachorują i tak dalej. Zamówienie jest ważne. :)
Daniel Mošmondor
12
@ DanielMošmondor Alternatywnie, możesz po prostu pamiętać, że kolejność jest ważna. Albo, że kiedy poprosiłeś w SO, ktoś dał ci RemiNder, o którym później zapomniałeś. Lub, że nie możesz użyć swojego nazwiska jako przypomnienia, ponieważ kolejność r i n jest odwrócona :)
Daniel Daranas
5
@RobKennedy haha ​​wiesz, że tu przyszedłem i czytałem o powrocie i pomyślałem „świetnie!”. Potem czytam twój komentarz. Teraz za każdym razem, gdy nie pamiętam, na którym kluczu nie powinienem patrzeć - patrzę na mój klawisz „Enter” i myślę, że „coś tu jest bardzo nie tak” ... haha, nad tym myśląc!
Wayne Uroda
53

Jeśli używasz C #, powinieneś użyć Environment.NewLine, który zgodnie z MSDN to:

Ciąg zawierający „\ r \ n” dla platform innych niż Unix lub ciąg zawierający „\ n” dla platform Unix.

BrunoLM
źródło
46
W rzeczywistości tego rodzaju zależy od tego, co robisz. Jeśli wysyłasz zwykły tekst do konsoli lub do pliku do użytku lokalnego, Environment.NewLinejest w porządku. Jeśli jednak piszesz rzeczy w dobrze zdefiniowanym formacie, format może również definiować nowy wiersz. Na przykład protokół HTTP stwierdza, że musisz użyć\r\n jako terminatora linii dla nagłówków itp., Niezależnie od platformy.
Matti Virkkunen
3
Tak, to naprawdę zła rada.
IvanP
Dlatego musisz uciec od wiadomości internetowych i zbudować testy jednostkowe, aby sprawdzić, czy wysyłanie \ r \ n (Windows), \ r (mac), \ n (linux) wysyła poprawnie jako \ r \ n do serwera.
TamusJRoyce
37

Nowa linia zależy od systemu operacyjnego:

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

Więcej informacji tutaj: https://ccrma.stanford.edu/~craig/utility/flip/

W razie wątpliwości skorzystaj z dowolnej darmowej przeglądarki / edytora szesnastkowego, aby zobaczyć, jak plik koduje nową linię.

Dla mnie używam następującego przewodnika, aby pomóc mi zapamiętać: 0D0A = \ r \ n = CR, LF = ca rr iage r eturn, li n e feed

Słońce
źródło
7
O dziwo, jestem jednym z tych ludzi, którzy wiedzą 0D0Ana pamięć, ale wciąż mylą \ri \n.
Nyerguds
1
Lub, pamiętam, że \ r to powrót karetki, a \ n to wysuw wiersza ... po prostu nie pamiętam ich kolejności, więc to nie pomaga w zapamiętaniu, który jest 0D, a który 0A;)
Nyerguds
20

Sekwencja to CR (Carriage Return) - LF (Line Feed). Pamiętasz drukarki igłowe? Dokładnie. Tak więc - poprawna kolejność to \ r \ n

Otávio Décio
źródło
Myślę, że to jest najbardziej logiczna odpowiedź
David Snabel-Caunt
12
LF + CR zrobiłby to samo CR + LF na drukarkach.
ikegami
10
Nie zgadzam się, @David. Samo myślenie o drukarkach igłowych (lub maszynach do pisania, ponieważ to one mają karetkę do powrotu) nie wystarczy. Mając tylko podstawowe informacje o tym, jak działają, nie ma powodu, aby sądzić, że ma to znaczenie, czy przejdziemy pracę przed czy po powrocie na początek linii. Zarówno \ r \ n, jak i \ n \ r umieszczają papier w tej samej pozycji.
Rob Kennedy
@ikegami na większości drukarek, nie na wszystkich. Mieli także przełączniki DIP, aby skonfigurować to zachowanie. :)
Daniel Mošmondor
5
Jednym z powodów umieszczenia przesuwu linii po powrocie karetki jest to, że skraca całkowity wymagany czas - gdy głowica wraca do lewej krawędzi papieru, płyta dociskowa może zindeksować jedną linię. Dłuższa operacja rozpoczyna się jako pierwsza, więc cała operacja kończy się w czasie, który trwa dłużej. Zrobiliśmy wtedy wiele rzeczy z takich powodów; wyobraź sobie, że czekasz kilkaset linii z prędkością 110 bodów ...
Jerry Andrews,
8

W każdym języku .NET Environment.NewLinebyłoby preferowane.

Esteban Araya
źródło
Nie działa dla ciągów ciągłych. W razie potrzeby lepiej nie używać stałej i zamiast tego używać łańcucha statycznego;)
TamusJRoyce
5

Uważaj, aby to zrobić ręcznie.
W rzeczywistości Radzę nie robi tego w ogóle.

W rzeczywistości mówimy o sekwencji zakończenia linii LTS, która jest specyficzna dla platformy.

Jeśli otworzysz plik w trybie tekstowym (tzn. Nie binarnym), strumienie przekonwertują „\ n” na poprawny LTS dla twojej platformy. Następnie przekonwertuj LTS z powrotem na „\ n” podczas czytania pliku.

W rezultacie, jeśli wydrukujesz „\ r \ n” do pliku systemu Windows, otrzymasz sekwencję „\ r \ r \ n” w pliku fizycznym (spójrz za pomocą edytora szesnastkowego).

Oczywiście jest to prawdziwy ból, jeśli chodzi o przesyłanie plików między platformami.

Teraz, jeśli piszesz do strumienia sieciowego, zrobiłbym to ręcznie (ponieważ większość protokołów sieciowych tak to nazywa). Ale upewniłbym się, że strumień nie dokonuje żadnej interpretacji (więc tryb binarny był odpowiedni).

Martin York
źródło
4

\r\n dla Windows będzie dobrze.

Ćwiek
źródło
Singiel \nrównież świetnie sobie radzi w systemie Windows, w tym w najnowszej wersji Notatnika.
André Caron
Myślę, że nowoczesne edytory wykryją zakończenia linii, ponieważ różne systemy operacyjne używają różnych zakończeń.
David Snabel-Caunt
1
Właściwie nie: Jeśli wydrukujesz to do pliku (plik std C / C ++ otwarty w trybie tekstowym) w systemie Windows, plik fizyczny będzie zawierał „\ r \ r \ n” (sprawdź to za pomocą edytora szesnastkowego). Po ponownym odczytaniu „\ r \ n” jest ponownie konwertowane na pojedynczy „\ n”.
Martin York
2
Właściwie @DavidCaunt, właśnie próbowałem \ n i nie działa z notatnikiem na Win8.
philk
4

Z Wikipedii (możesz przeczytać, który jest odpowiedni dla twojego systemu operacyjnego w tym artykule):

Systemy oparte na ASCII lub zgodnym zestawie znaków używają LF (przesunięcie wiersza, „\ n”, 0x0A, 10 w systemie dziesiętnym) lub CR (powrót karetki, „\ r”, 0x0D, 13 w systemie dziesiętnym) indywidualnie lub CR, po którym następuje LF (CR + LF, '\ r \ n', 0x0D0A).

bhamby
źródło
3

\r\n

Dziwnie jest powiedzieć, że pamiętam, ponieważ jest to przeciwieństwo używanej maszyny do pisania .
Cóż, jeśli to normalne, nie musiałbym o tym pamiętać ...:-)

maszyna do pisania z wikipedii * Zdjęcie z Wikipedii

W maszynie do pisania po zakończeniu cyfry linii używasz dźwigni powrotu karetki , która wcześniej sprawia, że ​​bęben obraca się , nowa linia , a po tym pozwala ręcznie obsługiwać powrót karetki .

Możesz posłuchać z tego nagrania ze strony freesound.org dźwięk podawania papieru na początku i około -1: 03 sekund od końca, po ostrzeżeniu dzwonka o końcu linii dźwięku bębna, który się toczy i po jeden ze zwrotu karetki.

Hastur
źródło
2

jeśli używasz C #, dlaczego nie używać Environment.NewLine? (Zakładam, że używasz niektórych obiektów do zapisywania plików ... po prostu przekaż go, Environment.NewLinea obsłuży odpowiednie terminatory.

NirMH
źródło