Windows neden CR LF kullanıyor?


87

İkisi arasındaki farkı anlıyorum, bu yüzden buna girmeye gerek yok, ancak Windows'un bir satır sonunu belirtmek için neden hem CR hem de LF kullandığının arkasındaki gerekçenin ne olduğunu merak ediyorum. Görünüşe göre Linux yöntemi (sadece LF kullanıyor) çok daha mantıklı, yerden tasarruf sağlıyor ve ayrıştırılması daha kolay.




İşte yeni satırın tarihi ile ilgili wikipedia: en.wikipedia.org/wiki/Newline#History
Szocske

Windows üzerindeki CRLF'nin çoğunlukla sadece bir kural / varsayılan olduğunu belirtmekte fayda var. Çoğu program ikisini de destekler (ancak ayarlarla uğraşmanız gerekebilir). Kişisel olarak neredeyse hiç CRLF kullanmıyorum, bunun yerine UNIX tarzı LF'yi tercih ediyorum; yalnızca bir avuç programın yalnızca LF kullanan dosyalarla hala sorunları var.
Kevin

CR + LF bunu yapmanın doğru yoludur ( standarttır ), bu nedenle soru Windows'un bunu neden doğru yaptığı değil, Mac ve Unix / Linux'un bunu neden yanlış yaptığıdır. Bağımsız LF'nin mirası tembellik ve kısayol kullanmaktır. CR + LF'ye bakan bazı Linux şeyleri dışında her zaman CR + LF kullanıyorum, bu yüzden bunun için LF moduna geçiyorum. IMO, CR + LF'yi yanlış yorumlamak, bağımsız bir LF'yi yanlış yorumlamaktan çok daha kötüdür.
birbiriyle bağlantılı

Yanıtlar:


97

Geçmişte kullanırken nokta vuruşlu yazıcılar teletipler CR, taşıyıcıyı satırın ilk konumuna geri döndürürken, LF bir sonraki satıra beslenir. Dosyada CR + LF kullanmak, herhangi bir yazıcı sürücüsü olmadan bir dosyayı doğrudan yazıcıya göndermeyi mümkün kıldı.

Teşekkürler @zaph nokta vuruşlu yazıcılar değil teletipler olduğunu belirtti


47
Çok az bir fayda için çok yaygın bir rahatsızlık.
Dávid Horváth

7
@Anders Aslında nedeni teletiplerdi, CR yazıcı kafasını sola döndürdü ve LF kağıdı ilerletti. Teletipler nokta vuruşlu yazıcılardan önce geliyordu.
zaph

5
@zaph Bu yüzden Stack Overflow'u seviyorum. 2 yıl sonra bir düzeltme aldım ve yeni bir şey öğrendim.
Anders Abel

Windows, Unix'i yıllarca takip ettiği için, sadece LF'nin Unix modelini takip etmemeleri şaşırtıcı.
belanger

32

@sshannin, Raymond Chen'in blogundan bir URL yayınladı, ancak artık çalışmıyor. Blog dahili yazılımını değiştirdi, dolayısıyla URL'ler de değişti.

Yeni blogdaki eski gönderileri taradıktan sonra burada buldum .

Blogdan alıntı:

Hat sonlandırıcı neden CR + LF'dir?

Bu protokol, teletip yazanlar günlerine kadar uzanır. CR, "satır başı" anlamına gelir - CR kontrol karakteri, kağıdı ilerletmeden baskı kafasını ("taşıma") sütun 0'a döndürdü. LF, "satır besleme" anlamına gelir - LF kontrol karakteri, yazdırma kafasını hareket ettirmeden kağıdı bir satır ilerletir. Dolayısıyla, yazıcı kafasını sıfır sütununa döndürmek (sonraki satırı yazdırmaya hazır) ve kağıdı ilerletmek (böylece yeni kağıda yazdırmak için) istiyorsanız, hem CR hem de LF'ye ihtiyacınız vardır.

RFC 0821 (SMTP), RFC 1939 (POP), RFC 2060 (IMAP) veya RFC 2616 (HTTP) gibi çeşitli internet protokol belgelerine giderseniz, hepsinin CR + LF'yi satır sonlandırma sırası. Yani asıl soru "CP / M, MS-DOS ve Win32 neden satır sonlandırıcı olarak CR + LF kullanıyor?" Değil. yerine "Neden başkaları bu standart belgelerinden farklı olmayı ve başka bir satır sonlandırıcı kullanmayı seçti?"

Unix, satır sonlandırma dizisi olarak düz LF'yi benimsedi. Stty seçeneklerine bakarsanız, onlcr seçeneğinin bir LF'nin CR + LF'ye değiştirilip değiştirilmeyeceğini belirttiğini göreceksiniz. Bu ayarı yanlış yaparsanız, merdiven basamağı metni alırsınız.

each
    line
        begins 

önceki satırın kaldığı yer. Dolayısıyla, ham modda bırakıldığında unix bile satırları sonlandırmak için CR + LF gerektirir. LF'den önceki örtük CR, satır başına bir bayt tasarrufu sağladığı için muhtemelen bir ekonomi olarak bir unix buluşudur.

C dilinin unix atası, bu kuralı, satırları sonlandırmak için yalnızca "\ n" (LF'yi kodlayan) gerektiren ve ham dosya verilerini mantıksal satırlara dönüştürmek için çalışma zamanı kitaplıklarına yük getiren C dili standardına taşıdı.

C dili ayrıca "genel hat sonlandırıcı" kavramını ifade etmek için "satırsonu" terimini tanıttı. Bana, ASCII komitesinin 0x0A karakterinin adını 1996 civarında "yeni satır" olarak değiştirdiği söylendi, bu yüzden kafa karışıklığı seviyesi daha da yükseldi.

Unix perspektifinden konuyla ilgili başka bir tartışma.

Bu ikinci bağlantıyı The Wayback Machine'deki bir anlık görüntüye değiştirdim, çünkü asıl sayfa artık mevcut değil.

Umarım bu, sorunuzu yanıtlamıştır.


Soruyu gerçekten cevaplamadığınız için, sadece bir yorumda eski hale gelen bir bağlantıyı düzelttiğiniz için , bu gerçekten bir yorum olmalı. Her neyse, doğru bağlantı için teşekkürler. Lütfen yorum olarak ekleyin, bu cevap silinebilir.
Tom Brunberg

1
Tamam, buraya blog metnini ekledim, bu yüzden bağlantı tekrar bozulursa metin hala burada. Bence bu sadece bir yorum değil, bir cevap olarak tutulmalı çünkü bu bilgi aslında ilk sorulan soruyu cevaplıyor.
OMA

9
Ben gerçekten Microsoft düzenli olarak kendi bağlantılarını obsoletes nefret ediyorum.
Mark Ransom

2
Bu cevap, hariç tutulandan daha ayrıntılıdır ve sadece sorulan soruyu cevaplamakla kalmaz, aynı zamanda sorunun nedenini tahmin eder, IMHO daha iyidir.
Alexei Martianov

18

Eski günlerden beri teletype makinelerinden (ve daktilolardan) geliyor.

Eskiden bir satır yazmayı bitirdiğinizde, daktilonun taşıyıcısını (kağıdı tutan ve yazarken sola kaydıran) satırın başına (CR) geri götürmeniz gerekiyordu. Daha sonra, sonraki satıra geçmek için kağıdı bir satır (LF) ilerletmeniz gerekiyordu.

Arabayı geri döndürürken satır beslemek istemediğiniz durumlar vardır, örneğin bir çizgi ile bir karakterin üstünü çizecek olsanız (sadece üzerine yazarsınız).

Ama temelde, geleneğe indirgeniyor. DOS tam CR / LF kuralını kullandı ve UNIX bunu biraz kısalttı. Şimdi sıkıştık!


2

Diğerleri cevabı verdi, ama eklemek istedim ... Sanırım daktilo kullanamayacak kadar gençsin? ;) Taşıyıcı bir tamburdur. Yatay olarak sağa hareket ettirmek, sabit tip başlığını sayfanın sol kenar boşluğuna geri getirir. Taşıyıcıyı parmağınızı ve baş parmağınızı kullanarak döndürmek, sayfayı bir satır ilerler.


2
Daktilo? Sanırım bunlardan birini bir müzede görmüştüm :)
Kyle

@Kyle Gülmem gerekiyordu ve bu günümü aydınlattı :)
likejudo

1

Gönderen Vikipedi :

CR + LF dizisi, bir konsol aygıtı olarak teletip makineleri, tipik olarak bir ASR33'ü benimseyen birçok eski bilgisayar sisteminde ortak kullanımdaydı, çünkü bu sıra, bu yazıcıları yeni bir hattın başlangıcına yerleştirmek için gerekliydi.


1

Veri aktarım hızını fiziksel baskı hızıyla daha iyi eşleştirmek için bir yerine iki karakter (ve bazen daha fazla) göndermenin nedeninin ( bu uzun zaman önceydi ) olduğunu gösteren birden fazla hesap gördüm . Baskı kafasını hareket ettirmek, tek bir karakter yazdırmaktan daha uzun sürdü ve fazladan karakterler göndermek, veri aktarımının baskı cihazının önüne geçmesini engellemenin bir yoluydu. Dolayısıyla, Windows'ta satır sonu için birden fazla karaktere sahip olmamızın nedeni, temelde QWERTY klavyelere sahip olmamızın nedeni ile aynı - işleri yavaşlatmak için tasarlanmıştı .

Açıkçası, bu uygulamanın Windows'ta bu güne kadar devam etmesinin nedeni, devam eden geriye dönük uyumluluk kavramına ve nihayetinde sadece basit eylemsizliğe dayanmaktadır.

Bununla birlikte, bu kuralın işletim sistemi düzeyinde Windows tarafından sıkı bir şekilde uygulanmadığını unutmayın . Herhangi bir Windows uygulaması, uyumlu olmaya çalıştığı diğer uygulamalara bağlı olarak kuralı yok saymakta özgürdür.

İlginç bir şekilde, "Newline" hakkındaki Wikipedia makalesi , Windows 8'in yalnızca LF kullanımına bir değişiklik getirebileceğini iddia ediyor. Makalede ayrıca Mac OS X'in LF + CR'den sadece LF'ye bir geçiş başlattığı belirtiliyor.


4
"İşleri yavaşlatmak niyetinde" - alıntı gerekli.
Elliot Gorokhovsky

4
Aslında, ilk paragrafın tamamı - alıntı gerekli.
Elliot Gorokhovsky

2
İşte aynı Wikipedia içeriğine atıfta bulunan yakından alakalı bir Jeff Atwood makalesi: The Great Newline Schism . Orada da çok sayıda akıllı kullanıcı yorumu var - bunun işletim sistemi düzeyinde bir sorun olmadığı ve Windows uygulamalarının çoğunun yalnızca LF metin dosyalarıyla iyi çalışacağı yönündeki bazı kanıtlar da dahil. Eğlenceli bir yorum da var: "Windows 10, 1963 Model 33 teletype makinesiyle uyumluluğu korumak için CR / LF kullanıyor ".
Brent Bradburn

1
@ RenéG Alıntıya ihtiyacım yok, oradaydım ve kendim için gördüm. Bazı eski nokta vuruşlu yazıcılar, iyi bir önlem için fazladan birkaç NUL'un atılmasını gerektiriyordu, çünkü arabirimin baud hızı arttıkça, kafa iki karakter değerinde zamana bile ayak uyduramıyordu. Arabelleğe alma ve akış kontrolü resme girdikçe bu sorun ortadan kalktı, ancak ilk yazıcılarda buna sahip değildi. Sonunda, yazıcılar yalnızca çıktı haline geldikçe, yerleşik anlaşmaya sahip paralel bir arabirime gittiler.
Mark Ransom

1
"Yaygın inanışın aksine, QWERTY düzeni daktiloyu yavaşlatmak için tasarlanmadı , ..." - Özellikler | QWERTY - Wikipedia
Jason Sparc
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.