it-swarm-eu.dev

Rozdíl mezi '\ n' a '\ r \ n'

Ano, vím, že '\n' zapíše nový řádek v UNIXu, zatímco pro Windows je zde dvě sekvence znaků: '\r\n'. To vše je teoreticky velmi pěkné, ale moje otázka zní proč ? Proč je znak návratu vozíku v systému Windows navíc? Pokud to UNIX dokáže v \n Proč to Windows vyžaduje dva znaky?

Čtu knihu Davida Beazleyho Python kniha) a říká:

Například v systému Windows při psaní znaku „\ n“ bude ve skutečnosti vydána dvoumístná posloupnost '\ r\n' (a při čtení souboru zpět '\ r\n' bude přeloženo zpět do jednoho '\ n' charakter).

Proč další úsilí?

Budu upřímný. Rozdíl jsem poznal už dlouhou dobu, ale nikdy jsem se neobtěžoval zeptat, proč. Doufám, že na to dnes odpovíme.

Díky za váš čas.

108
sukhbir

Zpětná kompatibilita.

Windows je zpětně kompatibilní s MS-DOS (agresivně ano) a MS-DOS používal konvenci CR-LF, protože MS-DOS byl kompatibilní s CP/M-80 (poněkud náhodou), který používal konvenci CR-LF, protože bylo to, jak jste řídili tiskárnu (protože tiskárny byly původně počítačem ovládané psací stroje).

Tiskárny mají samostatný příkaz k přesunutí papíru o jeden řádek na nový řádek a samostatný příkaz pro vrácení vozíku (tam, kde byl papír připevněn) zpět k levému okraji.

Proto. A ano, je to nepříjemnost, ale je to součást balíčku, který umožnil MS-DOS vyhrát nad CP/M a Windows 95 vyhrát nad všemi ostatními GUI nad DOS a Windows XP převzít ze systému Windows 98.

(Poznámka: Moderní laserové tiskárny stále mají tyto příkazy, protože jsou také zpětně kompatibilní s dřívějšími tiskárnami - zejména HP to dělá dobře)

Pro ty, kteří neznají psací stroje, zde je video ukazující, jak bylo psaní provedeno: http://www.youtube.com/watch?v=LJvGiU_UyEQ . Všimněte si, že papír je nejprve posunut nahoru a poté je vozík vrácen, i když k tomu dojde jednoduchým pohybem. Ding oznámil pisateli, že konec je blízko, a připravit se na to.

133
user1249

Pokud vím, toto to připomíná dny psacích strojů.

\r je návrat vozíku, což je to, co se pohybuje tam, kam píšete na stránce zpět doleva (nebo doprava, pokud je to vaše kultura)

\n je nový řádek, který posune váš papír nahoru o řádek.

Pokud na psacím stroji uděláte jen jeden z nich, dostaneš se na špatné místo a začneš psát nový řádek textu.

Když přišly počítače, myslím, že někteří lidé ponechali starý model, ale jiní si uvědomili, že to nebylo nutné, a zapouzdřili celou novou řadu jako jednu postavu.

21
Matt Ellen

Nevím, jestli se jedná o běžné znalosti, ale je třeba poznamenat, že CR je stále chápáno moderními terminálovými emulátory:

$ printf "hey world\rsup\n"
sup world

Je to užitečné pro ukazatele pokroku, např.

for i in {1..100}
do
    printf "\rLoading... %d%%" $i
    sleep 0.01
done
echo
9
Daniel Lubarov

Historicky znamenal řádkový posuv, že deska - válec, na který píšete - otočila jeden řádek, což způsobilo, že se text objevil na dalším řádku ... ale v dalším sloupci.

Návrat vozíku znamená „vrátit bit, kterým píšete, na začátek řádku“.

Windows používá CR + LF, protože MS-DOS ano, protože CP/M ano, protože to dávalo smysl pro sériové linky.

Unix zkopíroval svou\n konvenci, protože Multics ano.

Mám podezření, že budete-li kopat dost daleko zpět, zjistíte politickou nesouhlas mezi implementátory!

(Vynechali jste zvláštní zábavný bit, kde je Macova konvence (nebo bývala) pouhým používáním CR k oddělení řádků. A nyní má Unicode také svůj vlastní oddělovač řádků, U + 2028!)

7
Frank Shearar

Historie znaku Newline (Wikipedia):

ASCII byl vyvinut současně ISO a ASA, předchůdnou organizací ANSI. V období let 1963–1968 podporovaly normy ISO použití buď CR + LF nebo LF samotný jako nový řádek), zatímco návrhy ASA podporovaly pouze CR + LF.

Sekvence CR + LF byla běžně používána na mnoha časných počítačových systémech, které přijaly teletypové stroje, obvykle ASR33, jako konzolové zařízení, protože tato sekvence byla požadována pro umístění těchto tiskáren na začátku nové linky. V těchto systémech byl text často rutinně složen tak, aby byl kompatibilní s těmito tiskárnami, protože koncepce ovladačů zařízení, která skrývá takové hardwarové detaily z aplikace, nebyla dosud dobře vyvinuta; aplikace musely hovořit přímo se strojem typu teletype a řídit se jeho konvencemi.

Oddělení těchto dvou funkcí zakrývalo skutečnost, že se tisková hlava nemohla vrátit z krajní pravice na začátek dalšího řádku v jednom znakovém čase. Proto byla posloupnost vždy poslána s ČR jako první. Ve skutečnosti bylo často nutné posílat další znaky (cizí CR nebo NUL, které jsou ignorovány), aby se tiskové hlavě poskytl čas k posunu k levému okraji.

I poté, co byly teletypy nahrazeny počítačovými terminály s vyššími přenosovými rychlostmi, mnoho operačních systémů stále podporovalo automatické odesílání těchto znaků výplně, aby byla kompatibilita s levnějšími terminály, které pro posouvání displeje vyžadovaly více časů znaků.

MS-DOS (1981) přijal CP/M CR + LF; Použití CR + LF CP/M mělo smysl pro používání počítačových terminálů přes sériové linky. Tato úmluva byla zděděna pozdějším operačním systémem Windows společnosti Microsoft.

Operační systém Multics začal s vývojem v roce 1964 a jako nový řádek použil samotný LF). Unix následoval praxi Multics a později systémy následoval Unix.

6
Craige

Co je to s lidmi, kteří se ptají „proč může Unix udělat \n a ne Windows “? Je to taková podivná otázka.

  1. OS s tím nemá téměř nic společného. Jde spíše o to, jak se aplikace, knihovny, protokoly a formáty souborů zabývají věcmi. Kromě toho, kde OS čte/zapisuje textové konfigurace nebo příkazy příkazového řádku, nemá smysl narušovat OS.
  2. Většina aplikací pro Windows umí přečíst obě \n a \r\n v pohodě. Oni také výstup \r\n, aby byli všichni šťastní. Program jednoduše „nedělá“ \n nebo \r\n - to přijímá jeden, druhý nebo oba a výstupy jeden, druhý nebo oba.
  3. Jako programátor by se vám to mělo téměř nikdy obtěžovat. Prakticky každý jazyk/platforma má zařízení pro psaní správné koncové řádky a nejčtenější čtení. Jediný čas, kdy jsem se musel vypořádat s problémem, bylo, když jsem napsal HTTP server - a to proto, že určitý prohlížeč (nápověda: další nejoblíbenější prohlížeč po IE) dělal \n místo správný\r\n.
  4. Mnohem relevantnější otázkou je, proč tolik moderních unixových aplikací vydává výstup pouze \n s plným vědomím, že existují některé protokoly a programy, které se jim nelíbí?
5
Rei Miyasaka

Důvody, které platí pro jejich různé systémy (\ n na systémech unixového typu,\r\n na Windows atd.), Je to, že jakmile jste si vybrali konvenci, nemůžete ji změnit, aniž byste rozbili spoustu souborů lidí. A to se obvykle mračilo.

Systémy typu Unix byly vyvinuty (velmi rané dny) pomocí různých modelů teletypu a v určitém okamžiku se někdo rozhodl, že by zařízení mělo nést návrat, když provedlo řádkové krmení.

Windows pocházely z DOSu, takže pro Windows je otázka opravdu taková: Proč DOS používal tuto posloupnost cr/lf? Myslím, že to má něco společného s CP/M, kde DOS má některé z jeho kořenů. Roli mohly opět hrát konkrétní modely teletypu.

4
Michael Kohne

Zde je odpověď z nejlepšího zdroje - Microsoft. Proč je koncový řádek CR + LF?

Tento protokol se datuje do dnů teletypewriterů. CR je zkratka pro „návrat vozíku“ - kontrolní znak CR vrátil tiskovou hlavu („vozík“) do sloupce 0 bez posunutí papíru. LF znamená "linefeed" - LF kontrolní znak posunul papír o jeden řádek bez pohybu tiskové hlavy. Pokud tedy chcete vrátit tiskovou hlavu do sloupec nula (připraven k tisku dalšího řádku) a posuňte papír (takže se tiskne na čerstvý papír), potřebujete CR i LF.

Pokud jdete do různých dokumentů internetového protokolu, jako jsou RFC 0821 (SMTP), RFC 1939 (POP), RFC 2060 (IMAP) nebo RFC 2616 (HTTP), uvidíte, že všichni určují CR + LF jako řádek ukončení řádku. Skutečnou otázkou tedy není „Proč používají CP/M, MS-DOS a Win32 CR + LF jako koncový řádek?“ ale spíše „Proč se jiní lidé rozhodli odlišit se od těchto standardních dokumentů a použít nějaký jiný koncový řádek?“

Unix přijal plain LF jako posloupnost zakončení řádku). Když se podíváte na stty možnosti, uvidíte, že volba onlcr určuje, zda a LF by mělo být změněno na CR + LF. Pokud se vám toto nastavení nepodaří, dostanete schodišťový text, kde

each
    line
        begins

kde předchozí řádek skončil. Takže i unix, když je ponechán v surovém režimu, vyžaduje, aby CR + LF ukončily řádky. Implicitní CR před LF) je unixový vynález, pravděpodobně jako ekonomika, protože šetří jeden bajt na řádek.

Unixový rodový původ jazyka C přenesl tuto konvenci do standardu jazyka C, který vyžaduje, aby pouze řádky "\ n" (které kódují LF) ukončily řádky, čímž se zatížení knihoven runtime převede na nezpracovaná souborová data na logické řádky.

Jazyk C také zavedl termín „newline“, který vyjadřuje pojem „generic terminator line“. Říká se mi, že komise ASCII změnila název znaku 0x0A na "newline" kolem roku 1996, takže úroveň zmatení byla ještě vyšší.

2
Ondra Žižka