Różnica między typami podziału linii CR LF, LF i CR?

756

Chciałbym poznać różnicę (z przykładami, jeśli to możliwe) między typami podziału linii CR LF (Windows), LF (Unix) i CR (Macintosh).

eozzy
źródło
9
Bardzo podobny, ale nie dokładny duplikat. \njest zwykle reprezentowany przez wysuw linii, ale niekoniecznie jest to wysuw linii.
Adrian McCarthy
92
CR i LF są znakami kontrolnymi ASCII i Unicode, \ra \nsą abstrakcjami używanymi w niektórych językach programowania. Zamknięcie tego pytania ukazuje podstawowe różnice między pytaniami i utrwala dezinformację.
Adrian McCarthy,
5
@AdrianMcCarthy To jest problem ze sposobem, w jaki bliskie głosy działają w pewien sposób jako odpowiedzi; odpowiedź twierdząca, że ​​oba były takie same, może zostać odrzucona, a następnie wyszarzona jako bardzo, bardzo błędna, ale potrzeba tylko 4 zgodnych głosów (porównywalnych do głosów poparcia), aby nastąpiło bardzo złe zamknięcie, bez możliwości przeciwstawienia się głosowaniu przed to się wydarzyło.
Jon Hanna
Takie sformułowanie pytania jest wprawdzie lepsze, ale dla wszystkich praktycznych celów pozostaje to samo pytanie.
Jukka K. Korpela,
6
@ JukkaK.Korpela: Nie, to naprawdę nie jest. \nnie oznacza tego samego we wszystkich językach programowania.
Adrian McCarthy

Odpowiedzi:

347

Tak naprawdę chodzi tylko o to, które bajty są przechowywane w pliku. CRjest kodem bajtowym powrotu karetki (od dni pisania maszyn do pisania) i LFpodobnie, dla nowego wiersza. Odnosi się tylko do bajtów umieszczonych jako znaczniki końca linii.

O wiele więcej informacji, jak zawsze, na wikipedii .

Piotr
źródło
52
Myślę, że warto również wspomnieć, że CRjest to postać ucieczki \ri LFpostać ucieczki \n. Ponadto Wikipedia: Newline .
Robert Vunabandi
1
Prostymi słowami CR and LFjest tylko koniec linii i nowa linia zgodnie z tym linkiem , czy to prawda?
shaijut
@shaijut CR oznacza Carriage Return. To właśnie zwróciło powóz na maszynach do pisania. W większości poprawne.
AliFurkan
763

CR i LF są znakami kontrolnymi odpowiednio zakodowanymi 0x0D(13 miejsc po przecinku) i 0x0A(10 miejsc po przecinku).

Służą do oznaczania podziału linii w pliku tekstowym. Jak wskazałeś, Windows używa dwóch znaków w sekwencji CR LF; Unix używa tylko LF, a stary MacOS (wcześniejszy Mac OS X) używa CR.

Apokryficzna perspektywa historyczna:

Jak wskazał Peter , CR = Carriage Return i LF = Line Feed , dwa wyrażenia mają swoje korzenie w starych maszynach do pisania / TTY. LF przesunął papier w górę (ale zachował identyczną pozycję poziomą), a CR przywrócił „karetkę”, tak aby następny wpisany znak znalazł się w skrajnej lewej pozycji na papierze (ale w tej samej linii). CR + LF robił oba, tj. Przygotowywał się do wpisania nowej linii. W miarę upływu czasu fizyczna semantyka kodów nie miała zastosowania, a ponieważ ilość pamięci i miejsca na dyskietkach była na wagę złota, niektórzy projektanci systemów operacyjnych zdecydowali się użyć tylko jednej z postaci, po prostu nie komunikowali się ze sobą zbyt dobrze; -)

Większość współczesnych edytorów tekstu i aplikacji tekstowych oferuje opcje / ustawienia itp., Które umożliwiają automatyczne wykrywanie konwencji końca pliku i odpowiednie wyświetlanie.

mjv
źródło
11
tak więc system operacyjny to jedyny system operacyjny, który prawidłowo używa tych znaków, powrót karetki, a następnie wstawianie wiersza.
Rolf
4
Czy byłoby zatem słuszne powiedzieć, że plik tekstowy utworzony w systemie Windows jest najbardziej zgodny z trzech, tj. Najprawdopodobniej wyświetla się we wszystkich trzech podzbiorach systemu operacyjnego?
Prometeusz,
3
@Hashim może wyświetlać się poprawnie, ale próba uruchomienia tekstowego skryptu powłoki ze znakami powrotu karetki zwykle spowoduje błąd
Omer
Prostymi słowami CR and LFjest tylko koniec linii i nowa linia zgodnie z tym linkiem , czy to prawda?
shaijut
Przekonałem się, że niektóre pliki w stylu Windows ( CR+LF) mogą wyświetlać się z podwójnymi znakami nowej linii w innych systemach. Prawdopodobnie edytor, który wyświetla tekst, obsługuje zarówno znak powrotu karetki, jak i znak wiersza jako separatory nowego wiersza i jako taki może utworzyć 2 linie, w których 1 był zamierzony. Chociaż CR+LFmoże być najbardziej kompatybilny, nie sądzę, że jest bez problemu.
Magnus Bull
458

Oto dobre podsumowanie, które znalazłem:

Znak powrotu karetki (CR) ( 0x0D, \r) przesuwa kursor na początek linii bez przechodzenia do następnej linii. Ten znak jest używany jako nowy znak linii w systemach operacyjnych Commodore i Early Macintosh (OS-9 i wcześniejszych).

Znak przesunięcia wiersza (LF) ( 0x0A, \n) przesuwa kursor w dół do następnego wiersza bez powrotu do początku wiersza. Ten znak jest używany jako nowy znak linii w systemach UNIX (Linux, Mac OSX itp.)

Sekwencja końca linii (EOL) ( 0x0D 0x0A, \r\n) to tak naprawdę dwa znaki ASCII, kombinacja znaków CR i LF. Przesuwa kursor zarówno do następnego wiersza, jak i do początku tego wiersza. Ten znak jest używany jako nowy znak wiersza w większości innych systemów operacyjnych innych niż Unix, w tym Microsoft Windows, Symbian OS i inne.

Źródło

Taylor Leese
źródło
1
Znak „tabulator pionowy” przesuwa kursor w dół i utrzymuje pozycję w linii, a nie znak LF. LF to EOL.
12431234123412341234123
2
@TaylorLeese Czy / r / n i / n / r są takie same?
Vicrobot
175

Ponieważ nie ma odpowiedzi na to pytanie, streszczono zwięźle:

Carriage Return (MAC pre-OSX)

  • CR
  • r
  • Kod ASCII 13

Line Feed (Linux, MAC OSX)

  • LF
  • \ n
  • Kod ASCII 10

Zwrot karetki i podawanie wiersza (Windows)

  • CRLF
  • \ r \ n
  • Kod ASCII 13, a następnie kod ASCII 10

Jeśli widzisz kod ASCII w dziwnym formacie, są one tylko liczbą 13 i 10 w innym podstawniku / podstawie, zwykle podstawie 8 (ósemkowej) lub podstawie 16 (szesnastkowej).

http://www.bluesock.org/~willg/dev/ascii.html

ahnbizcad
źródło
46

Jeff Atwood opublikował na blogu najnowszy post: The Great Newline Schism

Oto esencja z Wikipedii :

Sekwencja CR + LF była powszechnie stosowana w wielu wczesnych systemach komputerowych, które przyjęły maszyny typu teletechnicznego, zwykle ASR33, jako urządzenie konsoli, ponieważ sekwencja ta była wymagana do umieszczenia tych drukarek na początku nowej linii. W tych systemach tekst był często rutynowo komponowany w celu zapewnienia zgodności z tymi drukarkami, ponieważ koncepcja sterowników urządzeń ukrywających takie szczegóły sprzętu przed aplikacją nie była jeszcze dobrze opracowana; aplikacje musiały rozmawiać bezpośrednio z maszyną teletechniczną i przestrzegać jej konwencji.Rozdzielenie tych dwóch funkcji ukrywało fakt, że głowica drukująca nie mogła wrócić od skrajnej prawej do początku następnego wiersza w czasie jednego znaku. Właśnie dlatego sekwencja była zawsze wysyłana najpierw z CR. W rzeczywistości często trzeba było wysyłać dodatkowe znaki (obce CR lub NUL, które są ignorowane), aby dać głowicy drukującej czas na przejście do lewego marginesu. Nawet po zastąpieniu teletypów terminalami komputerowymi o większej szybkości transmisji wiele systemów operacyjnych nadal obsługiwało automatyczne wysyłanie tych znaków wypełniania, aby zapewnić zgodność z tańszymi terminalami, które wymagały wielokrotnego przewijania ekranu.

Manu
źródło
5
+1 Z tego prostego zrozumienia zawsze pamiętam, w jakiej kolejności występuje kombinacja. Nawet dzisiaj możemy zobaczyć tę mechaniczną logikę w dowolnej drukarce atramentowej (uwielbiam to rozumieć, ponieważ nienawidzę się uczyć). Moje inne sztuczki pamięci to: „mac? Return to sender” i „NewLineFeed” (aby pamiętać, że NL === LF i pamiętać \, ponieważ CR ma już skrót R w skrócie)
GitaarLAB
3
„Wątpię… dwa kody sterujące były potrzebne do pomiaru czasu”. To nie tak mówi. Mówi, że dodatkowe CR i NUL są tutaj, aby dać czas na powrót, a nie oryginalny CR LF.
Julien Rousseau
11
@Adrian Czy weźmiesz doświadczenie persona? 1) W moich dawnych czasach teletechnicznych drukarka, której użyliśmy, wymagała <CR><CR><LF>- więc oczywiście eksperymentowałem tylko z jednym <CR>. Wysłałem <CR><LF>Apo długiej kolejce, i można usłyszećA drukowane zanim karetka pełni zwrócone.
John Burger,
11
@Adrian 2) Nie zapominaj, że było to w erze elektromechanicznej, w której każda postać pełniła dokładnie jedną funkcję. Często podkreślaliśmy słowo, drukując wiersz, a następnie wysyłając <CR><CR>i wpisując odpowiednią liczbę spacji, a następnie ponownie drukując to samo słowo: prymitywna forma pogrubienia.
John Burger,
3
@Adrian 3) I w końcu używał Baudot (lub kodu Murraya), a nie ASCII. Pięć bitów danych, od jednego bitu początkowego do półtora bitu stopu. Jak możesz mieć trochę trochę? Poczekaj pół czasu przed rozpoczęciem wysyłania następnego znaku, aby dać głowicy drukującej czas na powrót do środka.
John Burger,
16

CR - kod ASCII 13

LF - kod ASCII 10.

Teoretycznie CR przywraca kursor do pierwszej pozycji (po lewej). LF przesuwa jedną linię przesuwając kursor o jedną linię w dół. Tak w dawnych czasach kontrolowałeś drukarki i monitory tekstowe. Znaki te są zwykle używane do oznaczania końca linii w plikach tekstowych. Różne systemy operacyjne stosowały różne konwencje. Jak zauważyłeś, system Windows używa kombinacji CR / LF, podczas gdy komputery Mac w wersjach wcześniejszych niż OSX używają tylko CR i tak dalej.

DmitryK
źródło
7

Systemy oparte na ASCII lub zgodnym zestawie znaków używają LF (przesunięcie wiersza, 0x0A, 10 w systemie dziesiętnym) lub CR (powrót karetki, 0x0D, 13 w systemie dziesiętnym) indywidualnie lub CR, a następnie LF (CR + LF, 0x0D 0x0A); Znaki te są oparte na poleceniach drukarki: Przesunięcie linii wskazuje, że jeden wiersz papieru powinien wysunąć się z drukarki, a znak powrotu karetki wskazuje, że karetka drukarki powinna powrócić na początek bieżącego wiersza.

Oto szczegóły .

pierrotlefou
źródło
5

Smutny stan „separatorów rekordów” lub „terminatorów linii” jest dziedzictwem mrocznych epok komputerów.

Teraz przyjmujemy za pewnik, że wszystko, co chcemy reprezentować, jest w jakiś sposób uporządkowanymi danymi i jest zgodne z różnymi abstrakcjami, które definiują linie, pliki, protokoły, wiadomości, znaczniki, cokolwiek.

Ale pewnego razu nie było to do końca prawdą. Wbudowane aplikacje sterujące znakami i przetwarzanie specyficzne dla urządzenia. Układy pozbawione mózgu, które wymagały zarówno CR, jak i LF, po prostu nie miały abstrakcji dla separatorów rekordów ani terminatorów linii. CR był niezbędny, aby teletyp lub wyświetlanie wideo powróciły do ​​pierwszej kolumny, a LF (dziś, NL, ten sam kod) był konieczny, aby przejść do następnej linii. Myślę, że pomysł zrobienia czegoś innego niż zrzucenie surowych danych do urządzenia był zbyt skomplikowany.

Wyobraź sobie, że Unix i Mac w rzeczywistości określiły abstrakcję końca linii. Niestety wymienili inne. (Unix, ahem, był pierwszy.) I oczywiście użyli kodu kontrolnego, który był już „bliski” SOP

Ponieważ prawie całe nasze dzisiejsze oprogramowanie operacyjne jest potomkiem systemów operacyjnych Unix, Mac lub MS, utknęliśmy w punkcie kończącym zamieszanie.

DigitalRoss
źródło
1

NL wyprowadzony z EBCDIC NL = x'15 ', który logicznie porównałby się z CRLF x'odoa ascii ... staje się to oczywiste, gdy fizycznie przenosimy dane z komputerów mainframe na środek pasma. Kolokwialnie (ponieważ tylko tajemni ludzie używają ebcdic) NL zostało zrównane z CR, LF lub CRLF

David
źródło