Tak, zdaję sobie sprawę, że '\n'
pisze do nowej linii w systemie UNIX, podczas gdy dla Windows jest sekwencja dwóch znaków: '\r\n'
. Wszystko to jest bardzo ładne w teorii, ale moje pytanie brzmi: dlaczego ? Dlaczego znak powrotu karetki jest dodatkowy w systemie Windows? Jeśli UNIX może to zrobić, \n
dlaczego zajmuje to Windowsowi dwa znaki?
Czytam książkę Davida Beazleya w Pythonie, a on mówi:
Na przykład w systemie Windows napisanie znaku „\ n” faktycznie wyprowadza dwuznakową sekwencję „\ r \ n” (a podczas odczytywania pliku ponownie „\ r \ n” jest tłumaczone z powrotem na pojedynczy „\ n” postać).
Dlaczego dodatkowy wysiłek?
Będę szczery. Różnicę znam od dawna, ale nigdy nie zadałem sobie trudu, by zapytać DLACZEGO. Mam nadzieję, że odpowiedź jest dziś.
Dziękuję za Twój czas.
źródło
\r\n
. Jest również używany przez większość tekstowych protokołów internetowych (np. SMTP, HTTP itp.) Z zasadniczo tego samego powodu, co Windows (tj. Historia).System.out.printf()
LubString.format()
) upewnij się, że używasz%n
jako CRLF do celów zgodności z systemem operacyjnym.\n
jest przestarzałe.\n\r
kilka razy. (Myślę, że to było coś z NetWare.)Odpowiedzi:
Kompatybilność wsteczna.
Windows jest wstecznie kompatybilny z MS-DOS (agresywnie, a nawet), a MS-DOS zastosował konwencję CR-LF, ponieważ MS-DOS był kompatybilny z CP / M-80 (nieco przypadkiem), który zastosował konwencję CR-LF, ponieważ to to jak prowadziłeś drukarkę (ponieważ drukarki były pierwotnie sterowanymi komputerowo maszynami do pisania).
Drukarki mają osobne polecenie przesunięcia papieru o jeden wiersz w górę do nowego wiersza oraz osobne polecenie powrotu karetki (tam, gdzie papier został zamontowany) z powrotem na lewy margines.
Dlatego. I tak, jest to irytujące, ale jest to część pakietu, który pozwolił MS-DOS wygrać z CP / M, a Windows 95 wygrać z wszystkimi innymi GUI na DOS, a Windows XP przejąć kontrolę z Windows 98.
(Uwaga: Nowoczesne drukarki laserowe nadal mają te polecenia, ponieważ one również są wstecznie kompatybilne z wcześniejszymi drukarkami - w szczególności HP robi to dobrze)
Dla osób niezaznajomionych z maszynami do pisania, oto film pokazujący, jak piszono na maszynie: http://www.youtube.com/watch?v=LJvGiU_UyEQ . Zauważ, że papier jest najpierw przesuwany w górę, a następnie karetka jest zwracana, nawet jeśli dzieje się to w prostym ruchu. Ding powiadomił maszynistkę, że koniec się zbliża i przygotowuje się na to.
źródło
O ile mi wiadomo, nawiązuje do czasów maszyn do pisania.
\r
to powrót karetki, czyli ruch, w którym piszesz na stronie z powrotem w lewo (lub w prawo, jeśli taka jest Twoja kultura)\n
to nowa linia, która przesuwa papier w górę o linię.Wykonanie tylko jednego z nich na maszynie do pisania postawi cię w niewłaściwym miejscu, aby rozpocząć pisanie nowego wiersza tekstu.
Kiedy pojawiły się komputery, pewnie niektórzy ludzie zachowali stary model, ale inni zdali sobie sprawę, że nie jest to konieczne i zapakowali całą nową linię jako jedną postać.
źródło
Nie wiem, czy jest to powszechna wiedza, ale należy zauważyć, że CR jest nadal rozumiany przez współczesne emulatory terminali:
Jest to przydatne w przypadku wskaźników postępu, np
źródło
Historycznie przesunięcie linii oznaczało, że wałek - wałek, na którym piszesz - obrócił jedną linię, powodując pojawienie się tekstu w następnej linii ... ale w następnej kolumnie.
Zwrot karetki oznacza „zwróć bit, za pomocą którego piszesz na początku wiersza”.
Windows używa CR + LF, ponieważ zrobił to MS-DOS, ponieważ zrobił to CP / M, ponieważ miało to sens dla linii szeregowych.
Unix skopiował swoją konwencję, ponieważ zrobił to Multics.
Podejrzewam, że jeśli wykopiesz wystarczająco daleko, znajdziesz polityczne spory między realizatorami!
(Pominąłeś dodatkowy zabawny bit, w którym konwencja Mac jest (lub kiedyś była), aby po prostu używać CR do oddzielania linii. A teraz Unicode ma również swój własny separator linii, U + 2028!)
źródło
Historia znaku nowej linii (Wikipedia):
źródło
Co to jest, gdy ludzie pytają „dlaczego Unix potrafi,
\n
a nie Windows”? To takie dziwne pytanie.\n
i\r\n
dobrze. Produkują również\r\n
, aby wszyscy byli szczęśliwi. Program nie tylko „wykonuje” jedno\n
lub drugie\r\n
- akceptuje jedno, drugie lub oba i wysyła jeden, drugi lub oba.\n
zamiast poprawnej\r\n
.\n
pełni wiedząc, że istnieją protokoły i programy, które tego nie lubią?źródło
Powodem, dla którego konwencje obowiązują w różnych systemach (\ n w systemach typu Unix, \ r \ n w systemie Windows itp.) Jest to, że po wybraniu konwencji NIE MOŻNA jej zmienić bez niszczenia wielu plików ludzi. I to na ogół marszczy brwi.
Systemy typu uniksowego zostały opracowane (bardzo wcześnie) przy użyciu różnych modeli teletypu, i w pewnym momencie ktoś zdecydował, że sprzęt powinien powrócić, gdy przesunie linię.
Windows pochodzi z DOS, więc dla Windows pytanie brzmi: Dlaczego DOS użył tej sekwencji cr / lf? Zgaduję, że ma to coś wspólnego z CP / M, gdzie DOS ma swoje korzenie. Ponownie, niektóre modele telegrafu mogły odegrać pewną rolę.
źródło
\n
, ale nadal go używa\r\n
? Gdyby to zrobili, zaczynając od systemu Windows XP, mogliby teraz zacząć zapisywać pliki za pomocą\n
zamiast\r\n
.Oto odpowiedź z najlepszego źródła - Microsoft. Dlaczego terminator linii CR + LF?
źródło