W jaki sposób \ n i \ r są obsługiwane inaczej w systemach Linux i Windows?

22

Myślę, że \nprzesuwa igłę w dół i \rprzesuwa igłę na początek linii (wyrównanie do lewej)? Nie jestem jednak pewien. Więc jeśli się mylę, popraw mnie ....

W każdym razie, powiedziano mi, że Windows i Linux uchwyt newlinesi carriage returnsinaczej. Chciałbym wiedzieć, jak traktują je inaczej i niektóre miejsca, w których warto pamiętać. Dzięki za odpowiedź.

千里 ち ゃ ん
źródło
Jak dotąd wiem, że \r\nw systemie Windows \n\rjest to w porządku, ale tak nie jest i pamiętam to, ponieważ \r\njest akronimem dla zarejestrowanej pielęgniarki. Słyszę również, że \nludzie używają tego w Linuksie i \rnie są używane w tym samym celu co \r\n. \rjest używany w naprawdę starym MacOS. Jednak nie zweryfikowałem tych faktów.
千里 ち ゃ ん
4
Nie dzwoń do nich, \ra \nponieważ sposób postępowania \nzależy od tego, gdzie go używasz. Lepiej do nich zadzwonić CRi LF.
Ignacio Vazquez-Abrams
Ignacio, te akronimy nie mają dla mnie żadnego znaczenia. Jak to nazywasz: /? OH ... ZWROT LINII i ZWROT PRZEWOZU. Dzięki, śleske.
千里 ち ゃ ん
@ IgnacioVazquez-Abrams Czy \ n nie jest identyczny z LF? Czy na jakimkolwiek wykresie ASCII nie jest znak 13 = \ n = LF?
barlop
1
@barlop: Nie w języku C podczas wyświetlania w systemie Windows.
Ignacio Vazquez-Abrams

Odpowiedzi:

21

Myślę, że \ n przesuwa igłę w dół, i \ r przesuwa igłę na początek linii (wyrównanie do lewej)? Nie jestem jednak pewien

To mniej więcej prawda, ale przede wszystkim ciekawość historyczna. Pierwotnie, linefeed (LF) był używany do przesuwania papieru o jedną linię na drukarkach i terminalach drukowanych ( teleprinters ); powrót karetki (CR) zwrócił głowicę drukującą na początek linii.

Prawdopodobnie nadal działa na nowoczesnych drukarkach, gdy są używane w „trybie tekstowym”, ale poza tym obecnie nie ma większego znaczenia.

W każdym razie powiedziano mi, że Windows i Linux inaczej obsługują znaki nowej linii i zwroty karetki.

Różnica polega po prostu na tym, że projektanci systemów operacyjnych musieli wybrać sposób reprezentowania początku nowej linii w tekście w plikach komputerowych. Z różnych powodów historycznych w świecie Uniksa / Linuksa jako nowy znak linii wybrano pojedynczy znak LF; MS-DOS wybrał CR + LF, a Windows to odziedziczył. Dlatego różne platformy używają różnych konwencji.

W praktyce staje się to coraz mniejszym problemem. Znacznik nowej linii jest tak naprawdę istotny tylko dla piktogramów przetwarzających „zwykły tekst”, a nie ma ich tak wiele - w większości wpływa tylko na kod źródłowy programu, pliki konfiguracyjne i niektóre proste pliki tekstowe z dokumentacją. Obecnie większość programów obsługujących tego rodzaju pliki (edytory, kompilatory itp.) Może obsługiwać obie konwencje nowego wiersza, więc nie ma znaczenia, który wybierzesz.

Są przypadki, w których narzędzia nalegają na „swoją” konwencję nowego wiersza (np. Skrypty powłoki Uniksa nie mogą używać CR + LF), w którym to przypadku należy użyć właściwej.

Śleske
źródło
Ta sama linia pytań: czy języki programowania rozpoznają \n\ri \nsą takie same? Na przykład, gdybym analizował plik tekstowy, który był edytowany na czyimś komputerze i zawierał podział wierszy zarówno w wersji Linux, jak i Windows, czy wykonałbym polecenie preg_matchfor \ni \n\rdałoby inne wyniki?
千里 ち ゃ ん
@ 千里 ち ゃ ん: To całkowicie zależy od języka programowania, kompilatora itp. W szczególności, jeśli użyjesz wyrażeń regularnych, będzie to zależeć od używanego silnika wyrażeń regularnych - niektóre rozróżniają różne zakończenia linii, niektóre nie (większość można skonfigurować w dowolny sposób, Wierzę).
śleske,
@ 千里 ち ゃ ん: Jeśli masz pytanie, w jaki sposób system / język programowania / silnik wyrażeń regularnych obsługuje różne konwencje nowego wiersza, po prostu zadaj je jako osobne pytanie.
śleske,
powinieneś pisać \ r \ n w niewłaściwy sposób. Jeśli chodzi o języki programowania, byłyby one w stanie odczytać poszczególne znaki, a ty programista widzi, które dane wejściowe są używane, a ty programista może również robić, co chcesz dla danych wyjściowych. Tak jak możesz powiedzieć „Napisz ABC, a następnie \ r \ r \ r \ n” dowolne znaki, które chcesz umieścić na końcu! niektóre inne znaki mogą nie być drukowalne i nie mogą zawierać żadnych grafik ani żadnych innych elementów. Mogą mieć pewne wbudowane funkcje, takie jak println, a to, czego używają w nowej linii, to jedno lub drugie, nie może to być jedno i drugie.
barlop
@ 千里 ち ゃ ん, a niektóre języki programowania mogą pozwolić ci wybrać, które zakończenie kończy się jako ustawienie w jednej z ich wbudowanych funkcji, więc nawet we wbudowanej funkcji możesz ... teoretycznie zresztą. +, jak wspomniano, w praktyce możesz napisać dowolne zakończenie linii, które chcesz ... chociaż możesz nie być w stanie zrobić tego tak skutecznie, jak w przypadku funkcji println.
barlop
14

CR i LF

Amerykański Standard Code for Information Interchange (ASCII) zdefiniował znaki kontrolne, w tym CARRIAGE-RETURN (CR) i LINE-FEED (LF), które były (i nadal są) używane do kontrolowania pozycji drukowania na drukarkach w sposób analogiczny do mechaniczne maszyny do pisania, które poprzedziły wczesne drukarki komputerowe.

Zależność od platformy

W Windows tradycyjnym separatorem linii w plikach tekstowych jest CR, a po nim LF

W starych (wcześniejszych niż OSX) systemach Apple Macintosh tradycyjnym separatorem linii w plikach tekstowych był CR

W systemach Unix i Linux tradycyjnym separatorem linii w plikach tekstowych jest LF.

\ n i \ r

W wielu językach programowania i skryptów \noznacza „nowy wiersz”. Czasami (ale nie zawsze) oznacza to znak ASCII LINE-FEED (LF), który, jak mówisz, przesuwa kursor (lub pozycję drukowania) w dół o jedną linię. W drukarce lub maszynie do pisania spowoduje to przesunięcie papieru o jedną linię w górę.

Niezmiennie \roznacza znak ASCII CARRIAGE-RETURN (CR), którego nazwa faktycznie pochodzi od mechanicznych maszyn do pisania, w których znajdował się klawisz powrotu karetki, który spowodował, że rolka („karetka”), która niosła papier, przesunęła się w prawo, napędzana przez sprężynę, tak daleko, jak to możliwe. W ten sposób ustawiając bieżącą pozycję pisania na lewym marginesie.

Programowanie

W niektórych językach programowania \nmoże oznaczać zależną od platformy sekwencję znaków kończących lub oddzielających wiersze w pliku tekstowym. Na przykład w Perlu print "\n"produkuje inną sekwencję znaków w systemie Linux niż w systemie Windows.

W Javie najlepszą praktyką jest to, że jeśli chcesz używać natywnych zakończeń linii dla platformy wykonawczej, nie należy jej używać \nani \rwcale. Powinieneś użyć System.getProperty("line.separator"). Powinieneś używać \ni \rgdzie chcesz LF i CR niezależnie od platformy (np. Jak w HTTP, FTP i innych protokołach komunikacji internetowej).

Uniksowy styl

W powłoce uniksowej sttymożna użyć polecenia, aby spowodować translację powłoki między tymi różnymi konwencjami. Na przykład stty -onlcrspowoduje, że powłoka następnie przetłumaczy wszystkie wychodzące LF na CR LF.

Linux i OSX przestrzegają konwencji Uniksa

Pliki tekstowe

Pliki tekstowe są nadal niezwykle ważne i szeroko stosowane. Na przykład HTML i XML to przykłady plików tekstowych. Większość ważnych protokołów internetowych, takich jak HTTP, jest zgodna z konwencjami plików tekstowych i zawiera specyfikacje zakończeń linii.

Drukarki

Większość drukarek innych niż najtańsze nadal szanuje CR i LF. W rzeczywistości są one fundamentalne dla najczęściej używanych języków opisu strony - PCL i Postscript.

RedGrittyBrick
źródło
1
Uwaga na temat Java: Generalnie nie jest prawdą, że „nie należy używać \ n lub \ r w ogóle”. Po prostu w Javie „\ n” to zawsze LF, a „\ r” to zawsze CR. Może to być dokładnie to, czego chcesz: jeśli chcesz określonego stylu zakończenia linii, użyj ich; jeśli wyraźnie chcą rodzimą linię końcową komputera są uruchomione na, a następnie użyć line.separator. To naprawdę zależy od tego, czego chcesz.
sleske
A BTW, println()używa automatycznie line.separator, więc jeśli chcesz mieć natywne zakończenia linii, możesz ich użyć println()(a jeśli potrzebujesz określonego rodzaju zakończenia linii, nie używaj go, ale używaj „\ n” itp.).
sleske
@sleske: Dobre punkty. Zaktualizuję odpowiednio swoją odpowiedź.
RedGrittyBrick
1
Czy istnieją języki lub kompilatory, w których \nznak kontrolny jest inny niż ASCII LF (inny niż systemy oparte na EBCDIC)? Mam na myśli to, co \noznacza literał ciąg lub znak, a nie efekt wysłania go do pliku lub urządzenia wyjściowego.
Keith Thompson
1
@KeithThompson: Dla Java: Tak, \nzawsze jest kod ASCII (i Unicode) 10, ponieważ JLS tak mówi wprost (JLS 3.10.6, „Sekwencje specjalne dla literałów znakowych i ciągowych” - sprawdziłem :-)). W przypadku innych języków - dobre pytanie.
śleske
4

Krótko mówiąc, był potrzebny do drukarek, ale teraz systemy operacyjne robią to nieco inaczej. W większości przypadków dobrze jest po prostu zrobić zarówno CR, jak i LF, \r\na w większości przypadków będzie to działać dobrze.

James Billingham
źródło
Czy Linux po prostu ignoruje \rlub powoduje jakąś zmianę zachowania?
Aaron Franke