Dlaczego system Windows używa CR LF?

85

Rozumiem różnicę między nimi, więc nie ma potrzeby, aby się w to zagłębiać, ale zastanawiam się, jakie jest powody, dla których system Windows używa zarówno CR, jak i LF do wskazania podziału wiersza. Wydaje się, że metoda Linuksa (po prostu używając LF) ma dużo więcej sensu, oszczędza miejsce i jest łatwiejsza do przeanalizowania.

Kyle
źródło
3
Newline # History
Tim Cooper
Oto wikipedia o historii nowej linii: en.wikipedia.org/wiki/Newline#History
Szocske
Warto zauważyć, że CRLF w systemie Windows jest głównie konwencją / wartością domyślną. Większość programów obsługuje oba te ustawienia (chociaż może być konieczne zepsucie ustawień). Osobiście prawie nigdy nie używam CRLF, zamiast tego wybieram LF w stylu UNIX; tylko nieliczne programy nadal mają problemy z plikami używającymi po prostu LF.
Kevin
CR + LF to właściwy sposób (jest to standard ), więc pytanie nie dotyczy tego, dlaczego Windows robi to poprawnie, ale dlaczego Mac i Unix / Linux robią to niepoprawnie. Dziedzictwem samodzielnego modelu LF jest lenistwo i chodzenie na skróty. Zawsze CR + LF, z wyjątkiem pewnych linuksowych rzeczy, które gapią się na CR + LF, więc w tym celu przełączam się na tryb LF. IMO, błędna interpretacja CR + LF jest o wiele gorsza niż błędna interpretacja samodzielnego modelu LF.
InterLinked

Odpowiedzi:

96

Historycznie podczas używania drukarki igłowe teletypes CR zwróci karetkę do pierwszej pozycji linii, podczas gdy LF przejdzie do następnej linii. Zastosowanie CR + LF w samym pliku umożliwiło przesłanie pliku bezpośrednio do drukarki, bez żadnego sterownika drukarki.

Dzięki @zaph wskazując, że to teletypy, a nie drukarki igłowe

Anders Abel
źródło
47
Bardzo powszechna irytacja z niewielkimi korzyściami.
Dávid Horváth
7
@ Anders Właściwie to teletypes był powodem, dla którego CR przesunął głowicę drukującą w lewo, a LF przesunął papier. Teletypy poprzedzały drukarki igłowe.
zaph
5
@zaph Dlatego uwielbiam przepełnienie stosu. 2 lata później dostaję korektę i nauczyłem się czegoś nowego.
Anders Abel
30

@sshannin opublikował adres URL z bloga Raymonda Chena, ale to już nie działa. Blog zmienił swoje oprogramowanie wewnętrzne, więc zmieniły się adresy URL.

Po przeszukaniu starych postów na nowym blogu znalazłem go tutaj .

Cytat z bloga:

Dlaczego terminator linii CR + LF?

Protokół ten sięga czasów teletyków. CR oznacza „powrót karetki” - znak kontrolny CR przywrócił głowicę drukującą („karetkę”) do kolumny 0 bez przesuwania papieru. LF oznacza „linefeed” - znak kontrolny LF przesuwał papier o jedną linię bez przesuwania głowicy drukującej. Więc jeśli chcesz przywrócić głowicę drukującą do zerowej kolumny (gotowa do wydrukowania następnej linii) i przesunąć papier (tak, aby wydrukowano na świeżym papierze), potrzebujesz zarówno CR, jak i LF.

Jeśli przejdziesz do różnych dokumentów protokołu internetowego, takich jak RFC 0821 (SMTP), RFC 1939 (POP), RFC 2060 (IMAP) lub RFC 2616 (HTTP), zobaczysz, że wszystkie określają CR + LF jako sekwencja zakończenia linii. Tak więc prawdziwe pytanie nie brzmi: „Dlaczego CP / M, MS-DOS i Win32 używają CR + LF jako terminatora linii?” ale raczej „Dlaczego inni ludzie zdecydowali się różnić od tych standardów i używać innego terminatora linii?”

Unix przyjął zwykły LF jako sekwencję zakończenia linii. Jeśli spojrzysz na opcje stty, zobaczysz, że opcja onlcr określa, czy LF powinno zostać zmienione na CR + LF. Jeśli źle zrobisz to ustawienie, otrzymasz tekst schodów, gdzie

each
    line
        begins 

gdzie poprzednia linia została przerwana. Tak więc nawet unix pozostawiony w trybie surowym wymaga CR + LF do zakończenia linii. Niejawna CR przed LF jest wynalazkiem unixowym, prawdopodobnie jako ekonomia, ponieważ oszczędza jeden bajt na linię.

Uniksowe pochodzenie języka C przeniosło tę konwencję do standardu języka C, który wymaga tylko „\ n” (który koduje LF) do zakańczania wierszy, co nakłada na biblioteki uruchomieniowe konieczność konwersji surowych danych plików na linie logiczne.

Język C wprowadził również termin „nowa linia”, aby wyrazić pojęcie „ogólnego terminatora linii”. Powiedziano mi, że komitet ASCII zmienił nazwę znaku 0x0A na „nowa linia” około 1996 roku, więc poziom zamieszania wzrósł jeszcze bardziej.

Oto kolejna dyskusja na ten temat z perspektywy Uniksa

Zmieniłem ten drugi link na migawkę w The Wayback Machine, ponieważ rzeczywista strona nie jest już dostępna.

Mam nadzieję, że to odpowiada na twoje pytanie.

OMA
źródło
Ponieważ tak naprawdę nie odpowiadasz na pytanie, tylko poprawiasz link, który stał się nieaktualny, w komentarzu powinien to być komentarz. W każdym razie dzięki za poprawny link. Dodaj go jako komentarz, ta odpowiedź może zostać usunięta.
Tom Brunberg
1
OK, dodałem tutaj tekst z bloga, więc jeśli link znowu się zepsuje, tekst jest nadal dostępny tutaj. Myślę, że należy to zachować jako odpowiedź, a nie tylko komentarz, ponieważ ta informacja faktycznie odpowiada na pierwotnie zadane pytanie.
OMA
7
I naprawdę nienawidzę sposób Microsoft obsoletes swoje linki na bieżąco.
Mark Ransom
1
Ta odpowiedź jest bardziej szczegółowa niż wyjątkowa i odpowiada nie tylko na zadane pytanie, ale także na zgadywaną przyczynę pytania, IMHO jest lepsze.
Alexei Martianov
18

Pochodzi z maszyn dalekopisowych (i maszyn do pisania) z dawnych czasów.

Kiedyś, kiedy kończyłeś pisać wiersz, trzeba było przesunąć karetkę maszyny do pisania (która trzymała papier i przesuwała się w lewo podczas pisania) z powrotem na początek wiersza (CR). Następnie trzeba było przesunąć papier o jedną linię (LF), aby przejść do następnej linii.

Są przypadki, w których możesz nie chcieć wysuwać wiersza podczas powrotu karetki, na przykład jeśli zamierzasz przekreślić znak z myślnikiem (po prostu go nadpisałeś).

Ale w zasadzie sprowadza się do konwencji. DOS używał pełnej konwencji CR / LF, a UNIX nieco ją skrócił. Teraz utknęliśmy!

Dave Markle
źródło
2

Inni udzielili odpowiedzi, ale chciałem dodać ... Wydaje mi się, że jesteś za młody, by używać maszyny do pisania? ;) Wózek to bęben. Przesunięcie go poziomo w prawo przenosi nagłówek tekstu stacjonarnego z powrotem na lewy margines strony. Obracanie karetki za pomocą palca i kciuka powoduje przewijanie strony o jedną linię.

likejudo
źródło
2
Maszyna do pisania? Chyba raz widziałem takie w muzeum :)
Kyle
@Kyle Musiałem się pośmiać i to rozjaśniło mój dzień :)
likejudo
1

Z Wikipedii :

Sekwencja CR + LF była powszechnie używana w wielu wczesnych systemach komputerowych, które przyjęły maszyny dalekopisowe, zazwyczaj ASR33, jako urządzenie konsolowe, ponieważ ta sekwencja była wymagana do umieszczenia tych drukarek na początku nowej linii.

Nick Heidke
źródło
1

Widziałem więcej niż jedno konto, z którego wynika, że ​​powodem wysłania dwóch znaków (a czasem więcej) zamiast jednego było lepsze dopasowanie szybkości przesyłania danych do fizycznej szybkości drukowania ( było to dawno temu ). Przesuwanie głowicy drukującej trwało dłużej niż drukowanie pojedynczego znaku, a wysyłanie dodatkowych znaków było sposobem na uniknięcie przedostania się transferu danych przed urządzenie drukujące. Tak więc powód, dla którego mamy wiele znaków końca linii w systemie Windows, jest w zasadzie taki sam jak powód, dla którego mamy klawiatury QWERTY - miało to spowolnić działanie .

Oczywiście powód, dla którego ta praktyka trwa w systemie Windows do dziś, jest oparty na pewnym pojęciu ciągłej kompatybilności wstecznej, a ostatecznie po prostu po prostu bezwładności.

Należy jednak zauważyć, że ta konwencja nie jest ściśle egzekwowana przez system Windows na poziomie systemu operacyjnego . Każda aplikacja systemu Windows może zignorować tę konwencję, w zależności od innych aplikacji, z którymi ma być zgodna.

Co ciekawe, w artykule Wikipedii o „Newline” stwierdza się, że Windows 8 może wprowadzić zmianę w używaniu tylko LF. Artykuł stwierdza również, że Mac OS X wprowadził przejście z LF + CR do samego LF.

Brent Bradburn
źródło
4
„Ma na celu spowolnienie” - potrzebne źródło.
Elliot Gorokhovsky
4
Właściwie cały pierwszy akapit - potrzebne cytowanie.
Elliot Gorokhovsky
2
Oto blisko powiązany artykuł Jeffa Atwooda, który odwołuje się do tej samej treści Wikipedii: Wielka schizma Newline . Jest tam również wiele inteligentnych komentarzy użytkowników - w tym pewne uzasadnienie mojego stanowiska, że ​​nie jest to problem na poziomie systemu operacyjnego i że większość aplikacji systemu Windows będzie działać dobrze z plikami tekstowymi tylko dla LF. Jest też zabawny komentarz: „Windows 10 używa CR / LF do zachowania kompatybilności z maszyną dalekopis 1963 Model 33 ”.
Brent Bradburn
1
@ RenéG Nie potrzebuję cytatu, byłem tam i sam to widziałem. Niektóre wczesne drukarki igłowe wymagały nawet kilku dodatkowych NUL-ów wrzuconych do środka, ponieważ wraz ze wzrostem szybkości transmisji interfejsu głowica nie nadążała nawet z dwoma znakami wartymi czasu. Ten problem zniknął, gdy pojawiło się buforowanie i kontrola przepływu, ale wczesne drukarki tego nie miały. W końcu, gdy drukarki stały się tylko wyjściami, przeszły do ​​interfejsu równoległego z wbudowanym uzgadnianiem.
Mark Ransom
1
„Wbrew powszechnemu przekonaniu układ QWERTY nie został zaprojektowany w celu spowolnienia pracy maszynistki…” - Właściwości | QWERTY - Wikipedia
Jason Sparc