Różnica między \ n i \ r?


608

Jaka jest różnica między \n(nowa linia) a \r(powrót karetki)?

W szczególności, czy istnieją jakieś praktyczne różnice między \ni \r? Czy są miejsca, w których należy użyć jednego zamiast drugiego?


3
Wszystkie odpowiedzi są dość przewidywalne, ale chciałbym wiedzieć, czy istnieją jakieś PRAKTYCZNE różnice między \ n i \ r. Czy są miejsca, w których należy używać jednego nad drugim?
Vlad the Impala,

9
cóż, tak, pliki tekstowe zawierające tylko LF (nowa linia) nie będą postrzegane jako zakończone w niektórych aplikacjach Windows, a pliki tekstowe zakończone CRLF będą miały dodatkowe znaki, jeśli zostaną otwarte w niektórych aplikacjach Linusa.
pavium,

2
tak, niektóre aplikacje konsolowe linux używają animacji obracania linii.
Murali,

8
Czy nadal jest normalnym Mac EOL? Jestem pewien, że dotyczy to Maca „Classic”, ale myślałem, że OS X został zunifikowany. (Pokazuje, jak dobrze znam komputery Mac, prawda?)
John Y,

11
historycznie używano \ n do przesuwania karetki w dół, podczas gdy \ r używano do przesuwania karetki z powrotem na lewą stronę strony.
karthik gorijavolu

Odpowiedzi:


826

Pod względem kodu ascii jest to 3 - ponieważ mają odpowiednio 10 i 13 ;-).

Ale poważnie, istnieje wiele:

  • w Uniksie i we wszystkich systemach uniksowych \njest kodem końca linii, \rco nie znaczy nic specjalnego
  • w konsekwencji, w C i większości języków, które go w jakiś sposób kopiują (nawet zdalnie), \njest standardową sekwencją ucieczki dla końca linii (w razie potrzeby przetłumaczoną na sekwencje specyficzne dla systemu operacyjnego)
  • w starych systemach Mac (wcześniejszych niż OS X) \rzamiast tego znajdował się kod końca linii
  • w systemie Windows (i wielu starych systemach operacyjnych) kod końca wiersza to 2 znaki, \r\n , w tej kolejności
  • jako (zaskakująca ;-) konsekwencja (powrót do systemów operacyjnych znacznie starszych niż Windows), \r\n to standardowe zakończenie linii dla formatów tekstowych w Internecie
  • dla elektromechanicznych „terminali” typu teletechnicznego \rnakazuje karetce cofanie się w lewo, aż dojdzie do lewego skrajnego zatrzymania (wolna operacja), \nrolce zwinięcie jednej linii (znacznie szybsza operacja) - to jest powód, dla którego zawsze masz \r wcześniej \n , aby rolka mogła się poruszać, gdy karetka wciąż jedzie w lewo! -) Wikipedia ma bardziej szczegółowe wyjaśnienie .
  • dla terminali w trybie znakowym (zazwyczaj emulujÄ parzystych starszym drukowania jak powyżej), natomiast w stanie surowym, \ra \ndziałają podobnie (z wyjątkiem zarówno pod względem kursora, jak tam jest nie przewóz lub wałek ;-)

W praktyce, w nowoczesnym kontekście pisania do pliku tekstowego, zawsze powinieneś używać \n(bazowe środowisko wykonawcze tłumaczy to, jeśli masz dziwny system operacyjny, np. Windows ;-). Jedynym powodem \rjest to, że piszesz na terminalu znaków (lub bardziej prawdopodobne, że emuluje go „okno konsoli”) i chcesz, aby następny wiersz, który piszesz, zastąpił ostatnio napisany (czasem używany do głupiej animacji ascii) „efekty np. pasków postępu) - staje się to jednak dość przestarzałe w świecie GUI ;-).


12
Aby dodać do historii w tej odpowiedzi: wraz ze wzrostem prędkości linii z 10 znaków na sekundę powrót karetki zajął więcej niż 2 znaki, a po znaku \0dodano dodatkowe nieszkodliwe znaki (zazwyczaj tj. NUL ), \naby umożliwić dodatkowe czas. Zostało to obsługiwane w sposób transparentny przez system operacyjny, więc nie znajdziesz żadnych śladów w starszym kodzie.
Mark Ransom,

11
W jaki sposób Windows jest „dziwnym” systemem operacyjnym?
mailmindlin

31
@mailmindlin - pytasz „W jaki sposób Windows jest„ dziwnym ”systemem operacyjnym?”. Odpowiedź: na więcej sposobów, niż mogę łatwo policzyć (nosząc skarpetki, więc palce nie są dozwolone :-). Wszystkie pozostałe systemy operacyjne, które przetrwały, są oparte na Uniksie ... Windows jest jedyny, WYJDŹ na wiele sposobów. W tym konkretnym kontekście Q - jest to jedyny, w którym DWIE bajty (\ n \ r) są kanonicznym zakończeniem linii ... bez rozsądnego powodu, z wyjątkiem tych starożytno-historycznych wyjaśnionych gdzie indziej w tym wątku ... co drugi system operacyjny ma jeden znak końca linii a5 (99% + z nich `\ n ').
Alex Martelli,

1
@ nic nie jest konieczne: Na przykład tools.ietf.org/html/rfc5322 , który zastąpił RFC 2822, określając format wiadomości e-mail.
Keith Thompson

3
Mała rada dla wszystkich, którzy w pewnym momencie swojego życia napiszą jakiś parser - nigdy nie zapominaj, aby odpowiednio obsłużyć zakończenie linii. Miałem z tym dość paskudne doświadczenie tylko dlatego, że zapomniałem o \r(używam Linuksa). Gdy zacząłem analizować plik, który wydawał się być poprawnym plikiem, mój parser zawiódł, ponieważ plik, który analizowałem, został utworzony w systemie Windows. : D Głównym problemem w tym wszystkim, jest to, że ani \nczy \rsą widoczne w tym sensie, że na przykład a, ., (itp znaki są.
rbaleksandar

122

Historycznie \nużywano a do przesuwania karetki w dół, podczas gdy \rużywano do przesuwania karetki z powrotem na lewą stronę strony.


8
Być może nie jest to zbyt praktyczna odpowiedź na pytanie komputerowe, ale historyczny smakołyk i tak dostaje ode mnie opinię.
John Y

1
Wyobraź sobie, że jesteś podobny do tego, kiedy przesuwasz część pisania na maszynie do pisania w lewo, aka. powrót.
Jo Smo

2
\ n nie przesuwa karetki w dół, obraca rolkę, aby przesunąć papier W GÓRĘ.
Roddy

5
Cały ruch jest względny. Gazeta to mój świat i powóz porusza się w dół: P
tster

2
FWIW, nadal może być „Carriage Return” na nowoczesnych systemach. Weź pod uwagę ten kod C printf("abcdefghijlm\rNOP\n");skompilowany z gcc-8 na OpenSuSe i uruchom na terminalu wyniki w tym wyniku NOPdefghijlm. \ R (powrót karetki) w ciągu powoduje, że kursor przesuwa się na początek linii (karetki), a znaki następujące po \ r (tj. „NOP”) zastępują to, co wcześniej tam było (tj. „Abc”)! Możesz osiągnąć podobny „ruch karetki” za pomocą backspace (\ b), co w printf("abcdefghijlm\b\bNOP\n");którym produkujeabcdefghijNOP
GMc

36

Dwie różne postacie.

\n jest używany jako terminator końca linii w plikach tekstowych systemu Unix

\r jest używany jako terminator końca linii w plikach tekstowych Mac

\r\n (tj. oba) są używane do zakończenia linii w plikach tekstowych Windows i DOS.


2
Zauważ, że istnieją / były komputery, które używały \ n \ r jako znacznika końca linii po naciśnięciu klawisza ENTER, podobnie jak Acorn i RISC OS.
Anders

9
Aby wyjaśnić: \rod dawna nie było końca linii na komputerze Mac. Wraz z wydaniem Mac OS X w 2001 roku (który jest oparty na Uniksie), \njest teraz używany.
jbbuckley

3
Ale nadal istnieją aplikacje korzystające z \r- np. MS Office 2011 Excel: Zapisanie pliku CSV (ze wszystkimi ustawieniami domyślnymi) - spowoduje zapisanie pliku zakodowanego w standardzie ISO-8859-1 z \rzakończeniami -line.
CodeBrauer,

24

Ponieważ nikt inny nie wspomniał o tym konkretnie (czy są zbyt młodzi, by wiedzieć / pamiętać?) - podejrzewam, że jest to użycie \r\n w maszynach do pisania i podobnych urządzeniach.

Gdy chciałeś nowego wiersza, korzystając z maszyny do pisania obsługującej wiele wierszy, trzeba było wykonać dwie czynności fizyczne: przesunąć karetkę z powrotem na początek strony (po lewej, w USA) i podać papier o jeden stopień .

Na przykład w czasach drukarek liniowych jedynym sposobem na pogrubienie tekstu było na przykład powrót karetki BEZ nowej linii i wydrukowanie tych samych znaków na starych, dodając w ten sposób więcej atramentu, przez co wydaje się ciemniejszy (pogrubiony) . Gdy mechaniczna funkcja „nowego wiersza” nie powiodła się w maszynie do pisania, był to irytujący wynik: możesz pisać powyżej poprzedniego wiersza tekstu, jeśli nie zwracasz uwagi.


3
Standardem ASCII dla nowej linii jest \ r \ n. (Oprócz krótkiej przerwy, kiedy Bell Telephone przejął kontrolę nad komitetem normalizacyjnym). W zamian za monopol telefoniczny Bell Telephone zrezygnował z usług przesyłania wiadomości (telegram, teletyp) i nie przejmował się istniejącym wykorzystaniem standardu. HTTP, HTML, PCDOS i MSDOS korzystały ze standardu ASCII. Bell Telephone wybrał niestandardowe rozwiązanie dla systemu Unix, ponieważ nie mieli oni żadnej istniejącej firmy, z którą mógłby być kompatybilny.
David

12

Dwa różne znaki dla różnych systemów operacyjnych. Odgrywa to również rolę w przesyłanych danych, TCP/IPktóre wymagają użycia\r\n .

\n Unix

\r Prochowiec

\r\n Windows i DOS.


10
Myślę, że mylisz się z protokołami aplikacyjnymi, TCP / IP nie ma pojęcia o \ ni \ r.
jean-loup

4
TCP / IP nie wymaga użycia \ r \ n. Wymagają tego różne protokoły oparte na Telnet, w tym SMTP, POP3, FTP, HTTP, ...
Markiz Lorne z

9

Ukończyć,

W skrypcie powłoki (bash) możesz użyć \rdo wysłania kursora, z przodu on-line i oczywiście\n aby umieścić kursor w nowej linii.

Na przykład spróbuj:

echo -en "AA--AA" ; echo -en "BB" ; echo -en "\rBB"
  • Pierwszy ekran „echa” AA--AA
  • Drugi : AA--AABB
  • Ostatni : BB--AABB

Ale nie zapomnij użyć -enjako parametrów.


5

W Windows \ n przechodzi na początek następnego wiersza. \ R przesuwa się na początek bieżącej linii, bez przechodzenia do następnej linii. Użyłem \ r we własnych aplikacjach konsolowych, w których testuję trochę kodu i nie chcę, aby tekst przewijał się po ekranie, więc zamiast używać \ n po wydrukowaniu tekstu, powiedzmy, liczby klatek na sekundę ( FPS), wydrukujęf („% - 10d \ r”, fps); Spowoduje to powrót kursora na początek linii bez przechodzenia do następnej linii i pozwoli mi wyświetlać na ekranie inne informacje, które nie zostaną przewinięte, gdy liczba klatek na sekundę będzie stale aktualizowana w tym samym wierszu (% -10 powoduje pewne wyjście ma co najmniej 10 znaków, wyrównane do lewej, więc kończy się spacjami, nadpisując wszelkie stare wartości dla tego wiersza). Jest to całkiem przydatne do takich rzeczy,

Trochę historii

/ R oznacza „return” lub „return return”, który zawdzięcza swoją historię maszynie do pisania. Zwrot karetki przesunął karetkę do końca w prawo, więc pisałeś na początku wiersza.

Symbol „n” oznacza „nową linię”, ponownie od dni, w których maszyna do pisania przeszła na nową linię. Jednak nie od samego początku, dlatego niektóre systemy operacyjne przyjęły potrzebę zarówno powrotu a / r, a następnie nowej linii / n, ponieważ taka była kolejność, w jakiej zrobiła to maszyna do pisania. Wyjaśnia także stare 8-bitowe komputery, które używały mieć „Return” zamiast „Enter” z „return return”, co było znane.


1

Żeby dodać zamieszanie, pracowałem nad prostym edytorem tekstu wykorzystującym element TextArea na stronie HTML w przeglądarce. W oczekiwaniu na problemy z kompatybilnością w odniesieniu do CR / LF napisałem kod, aby sprawdzić platformę i użyć dowolnej konwencji nowej linii, która miała zastosowanie do platformy.

Jednak odkryłem coś ciekawego podczas sprawdzania rzeczywisty znaki zawarte w TextArea, za pomocą małej funkcji JavaScript, która generuje dane szesnastkowe odpowiadające tym znakom.

Do testu wpisałem następujący tekst:

Witaj świecie [wejdź]

Do widzenia, okrutny świecie [wejdź]

Gdy sprawdziłem dane tekstowe, otrzymałem następującą sekwencję bajtów:

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

Teraz większość ludzi, patrząc na to i widząc 0a, ale bez bajtów 0d, pomyślałoby, że ten wynik uzyskano na platformie Unix / Linux. Ale oto rub: tę sekwencję uzyskałem w Google Chrome na Windows 7 64-bit.

Tak więc, jeśli używasz elementu TextArea i badasz tekst, SPRAWDŹ wynik, tak jak to zrobiłem powyżej, aby upewnić się, jakie rzeczywiste bajty znaków są zwracane z Twojego TextArea. Nie wiem, czy różni się to na innych platformach lub w innych przeglądarkach, ale warto o tym pamiętać, jeśli wykonujesz przetwarzanie tekstu za pomocą JavaScript i musisz uniezależnić tę platformę przetwarzania tekstu.

Konwencje opisane w powyższych postach dotyczą danych wyjściowych konsoli , ale elementy HTML, jak się wydaje, są zgodne z konwencją UNIX / Linux. Chyba że ktoś odkryje inaczej na innej platformie / przeglądarce.


0
#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();

}

weźmy ten przykład spróbuj umieścić \ n zamiast \ r to nie zadziała i spróbuj zgadnąć dlaczego?


1
Działa to tylko wtedy, gdy Twój podkreślający system operacyjny wysyła \ r \ n po naciśnięciu klawisza ENTER, np. MS DOS, DECS TOPS-10, CP / M, RT-11 itd. W systemach operacyjnych: takich jak Multic, Unix i Unix-like ( Linux, Minix itp.) BeOS, RISCOS itp. Klawisz ENTER wysyła tylko znak \ n.
Anders

1
Ach tak, dawne dobre czasy, kiedy klawiatury posiadały jedno Returni drugie Enter. Nawet moja nowoczesna klawiatura bezprzewodowa nadal pokazuje strzałkę w dół i do tyłu na starym Returnklawiszu (który jest teraz zatytułowany „Enter”, aby zachować spójność z klawiszem klawiatury numerycznej Enter, który nie pokazuje strzałki)
dniu

0

Jaka jest różnica między \ n (nowa linia) i \ r (powrót karetki)?

W szczególności, czy istnieją jakieś praktyczne różnice między \ni \r? Czy są miejsca, w których należy użyć jednego zamiast drugiego?


Chciałbym zrobić krótki eksperyment z odpowiednimi sekwencjami ucieczki \ndla nowej linii i\r dla znaku powrotu karetki, aby zilustrować, gdzie jest wyraźna różnica między nimi.

Wiem, że to pytanie zostało zadane jako niezależne od języka. Niemniej jednak potrzebujemy języka przynajmniej w celu przeprowadzenia eksperymentu. W moim przypadku wybrałem C ++, ale eksperyment powinien zasadniczo mieć zastosowanie w dowolnym języku programowania.

Program po prostu wykonuje iterację, aby wydrukować zdanie w konsoli, wykonując iterację dla pętli for.


Program Newline:

#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;
}

Wynik:

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

Zauważ, że ten wynik nie zostanie podany w żadnym systemie, wykonujesz ten kod C ++. Ale to powinno działać w przypadku najnowocześniejszych systemów. Przeczytaj poniżej, aby uzyskać więcej informacji.


Teraz ten sam program, ale z tą różnicą, że \njest zastępowany \rna końcu sekwencji drukowania.

Program zwrotu karetki:

#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;
}

Wynik:

7.Walkthrough of the for-loop 

Zauważyłeś, gdzie jest różnica? Różnica jest taka, że ​​w przypadku korzystania z sekwencji ucieczki powozu\r na końcu każdej sekwencji drukowania, następna iteracja tej sekwencji nie przechodzi do następującego wiersza tekstowego - Na końcu każdej sekwencji drukowania kursor nie przeskoczył na początek * następnej linii.

Zamiast tego kursor przeskoczył z powrotem na początek linii, na której był na końcu, przed użyciem \r znaku. - W rezultacie każda kolejna iteracja sekwencji drukowania zastępuje poprzednią.

* Uwaga: A \nniekoniecznie przeskakuj na początek następnej linii tekstu. W niektórych, ogólnie starszych, systemach operacyjnych wynikiem \nznaku nowej linii może być to, że przeskakuje on w dowolne miejsce w następnej linii, a nie tylko na początek. Dlatego wymagają użycia, \r \naby dostać się na początek następnego wiersza tekstu.


Ten eksperyment pokazał nam różnicę między znakiem nowej linii i znakiem powrotu karetki w kontekście wyniku iteracji sekwencji drukowania.

Dyskutując o danych wejściowych w programie niektóre terminale / konsole mogą pośrednio konwertować znak powrotu karetki na nowy wiersz w celu lepszej przenośności, kompatybilności i integralności.

Ale jeśli masz wybór, aby wybrać jeden dla drugiego lub chcesz lub musisz wyraźnie użyć tylko określonego, zawsze powinieneś działać z tym, który pasuje do jego celu i ściśle rozróżnia.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.