Linux ve Windows'ta \ n ve nasıl farklı şekilde ele alınır?


22

Sanırım \niğneyi aşağı doğru \rhareket ettirir ve iğneyi bir çizginin başlangıcına (sola doğru) hareket ettirir? Emin değilim. Öyleyse yanılıyorsam düzelt beni ....

Her neyse, o Windows ve Linux kolu söylendi newlinesve carriage returnsfarklı. Onları nasıl farklı bir şekilde ele aldıklarını ve hatırlanmasının önemli olduğu bazı yerleri bilmek istiyorum. Cevapladığınız için teşekkürler.


Şimdiye dek bunun \r\nWindows’ta sorunlu olduğunu biliyorum ama \n\rdeğil ve hatırlıyorum çünkü \r\nkayıtlı hemşirenin kısaltması. Ayrıca \ninsanların Linux'ta \rkullandıklarını ve aynı amaçla tek başına kullanılmadıklarını duydum \r\n. \rgerçekten eski MacOS'ta kullanılır. Yine de bu gerçekleri doğrulamamıştım.
千里 ち ゃ ん

4
Onları deme \rve \nyana nasıl \nkullandıysanız bunu yere göre değişir ele alınır. Onları aramak CRve daha iyi LF.
Ignacio Vazquez-Abrams,

Ignacio, bu kısaltmaların benim için bir anlamı yok. Siz buna ne diyorsunuz :/? OH ... HAT YEMİ ve TAŞIYICI İADE. Sağol Sleske.
ん ち ゃ ん

@ IgnacioVazquez-Abrams LF ile aynı değil mi? Herhangi bir ASCII tablosunda, karakter 13 = \ n = LF değil mi?
barlop

1
@ barlop: Windows'da çıktığı zaman C cinsinden değil.
Ignacio Vazquez-Abrams,

Yanıtlar:


21

Sanırım \ n iğneyi aşağı doğru hareket ettirir ve iğneyi bir çizginin başlangıcına (sola doğru) hareket ettirir mi? Emin değilim ama

Bu doğrudur, az ya da çok, ama çoğunlukla tarihi bir merak. Orijinal olarak, kağıdı yazıcılar ve basılı terminallerde ( teleprinters ) bir satır ilerletmek için satır besleme (LF) kullanıldı ; satır başı (CR) yazıcı kafasını satırın başına döndürdü.

Bu, muhtemelen "metin modunda" kullanıldığında modern yazıcılarda hala çalışır, ancak bugün başka bir önemi yoktur.

Her neyse, Windows ve Linux'un yeni satırları idare ettiği ve taşımacılığın farklı olduğu söylendi.

Aradaki fark şudur: İşletim sistemi tasarımcıları, bilgisayar dosyalarındaki metinde yeni bir satırın başlangıcını nasıl temsil edeceklerini seçmek zorunda kaldı. Çeşitli tarihsel nedenlerden dolayı, Unix / Linux dünyasında, yeni satır işaretçisi olarak tek bir LF karakteri seçildi; MS-DOS CR + LF'yi seçti ve Windows bunu devraldı. Bu nedenle farklı platformlar farklı kuralları kullanır.

Uygulamada, bu bir problemin giderek azalmasıdır. Newline marker gerçekten sadece "düz metni" işleyen pogramlarla ilgilidir ve çok fazla bir şey yoktur - çoğunlukla sadece program kaynak kodunu, konfigürasyon dosyalarını ve dokümantasyonu olan bazı basit metin dosyalarını etkiler. Günümüzde, bu tür dosyaları kullanan çoğu program (editörler, derleyiciler vb.) Her iki yeni satır sözleşmesini de idare edebilir, bu yüzden hangisini seçtiğiniz önemli değildir.

Araçların "yeni" sözleşmelerinde ısrar eden bazı durumlar vardır (örn. Unix kabuk komut dosyaları CR + LF kullanmamalıdır), bu durumda doğru olanı kullanmalısınız.


Sorgulama Aynı satır: diller tanıyan programlama yapmak \n\rve \naynı olarak? Ben başkasının PC'de düzenlenebilir ve satır sonları Linux ve Windows sürümü hem içerdiği bir metin dosyası ayrıştırma olsaydı Örneğin, bir performans olurdu preg_matchiçin \nve \n\rbana farklı sonuçlar verir?
ん ち ゃ ん

@ 千里 ち ゃ ん: Bu tamamen programlama diline, derleyiciye vb. Bağlıdır. Özellikle, regex'ler kullanıyorsanız, kullandığınız regex motoruna bağlı olacaktır - bazıları farklı satır sonlarını ayırt eder, bazıları hayır (çoğu şekilde yapılandırılabilir, İnanıyorum).
sleske,

@ 千里 ち ゃ ん: Bazı sistem / programlama dilleri / düzenli ifade motorlarının farklı yeni satır sözleşmelerini nasıl ele aldığına ilişkin bir sorunuz varsa, bunu ayrı bir soru olarak sorun.
sleske,

yazdığın gibi yanlış bir şekilde yazılmamalı. Programlama dilleri ile ilgili olarak, karakterleri ayrı ayrı okuyabileceklerdi ve siz programcı girdide hangisinin kullanıldığını görebilir ve programcı da çıktı için istediğiniz gibi yapabilirsiniz. Tıpkı "ABC'yi yazdıktan sonra \ r \ r \ r \ n" diyebildiğiniz gibi, sonuna yapıştırmak istediğiniz karakterleri! diğer bazı karakterler yazdırılamayabilir ve grafik veya herhangi bir şekilde olmayabilir. Println gibi bazı yerleşik işlevlere sahip olabilirler ve yeni satırlarında kullandıkları şey biri ya da diğeri olurdu, ikisi de olamaz.
barlop

@ 千里 which nie built ve bazı programlama dilleri, hangi fonksiyonların yerleşik fonksiyonlardan birinde bir ayar olarak bittiğini seçmenize izin verebilir, böylece yerleşik bir fonksiyonda bile ... teorik olarak. + Bahsedildiği gibi, pratikte istediğiniz bir satır sonunu yazabilirsiniz ... ancak println işlevinde olduğu gibi verimli bir şekilde yapamayabilirsiniz.
barlop

14

CR ve LF

Bilgi Değişimine İlişkin Amerikan Standart Kodu (ASCII), yazıcılardaki baskı pozisyonunu yazıcıya benzer şekilde kontrol etmek için kullanılan (ve hala da) bulunan kontrol karakterlerini tanımladı. erken bilgisayar yazıcılarından önceki mekanik daktilolar.

Platform bağımlılığı

Windows'ta metin dosyalarındaki geleneksel satır ayırıcı CR ve ardından LF

Eski (OSX öncesi) Apple Macintosh sistemlerinde, metin dosyalarındaki geleneksel çizgi ayırıcı CR idi.

Unix ve Linux'ta, metin dosyalarındaki geleneksel çizgi ayırıcı LF'dir.

\ n ve

Birçok programlama ve komut dosyası dilinde \n"yeni satır" anlamına gelir. Bazen (ancak her zaman değil) bu, söylediğiniz gibi imleci (veya yazdırma konumunu) bir satır aşağı hareket ettiren ASCII LINE-FEED karakteri (LF) anlamına gelir. Bir yazıcıda veya daktiloda, bu aslında kağıdı bir satır yukarı taşır.

Değişmeyen bir \rşekilde, adı aslında daktilolardan gelen ASCII CARRIAGE-RETURN karakteri (CR), kağıdın bir yayınla beslenmesini sağlayan, sağa doğru hareket etmesine neden olan rulonun ("taşıyıcı") taşınmasını sağlayan bir satır başı anahtarı olduğu anlamına gelir; gidebildiği kadarıyla. Böylece mevcut yazma pozisyonunun sol kenar boşluğuna ayarlanması.

Programlama

Bazı programlama dillerinde \n, bir metin dosyasındaki satırları biten veya ayıran platforma bağlı bir karakter dizisi anlamına gelebilir. Örneğin Perl'de print "\n"Linux'ta Windows'takinden farklı bir karakter dizisi üretir.

Java'da, çalışma zamanı platformu için yerel satır sonlarını kullanmak istiyorsanız en iyi yöntem, kullanmamak \nveya \rhiç kullanmamaktır . Kullanmalısın System.getProperty("line.separator"). Sen kullanmalıdır \nve \rne olursa olsun platform LF ve CR istediğiniz yere (HTTP, FTP ve diğer Internet iletişim protokollerinde örneğin kullanıldığı gibi).

Unix stty

Bir Unix kabuğunda, sttykabuğun bu çeşitli kurallar arasında çevirmesine neden olmak için komut kullanılabilir. Örneğin stty -onlcr, kabuğun daha sonra tüm giden LF'leri CR LF'ye çevirmesine neden olacaktır.

Linux ve OSX, Unix kurallarını takip ediyor

Metin dosyaları

Metin dosyaları hala çok önemli ve yaygın olarak kullanılıyor. Örneğin, HTML ve XML metin dosyası örnekleridir. HTTP gibi önemli İnternet protokollerinin çoğu, metin dosyası kurallarını izler ve satır sonları için özellikleri içerir.

Yazıcılar

En ucuz olanların dışında çoğu yazıcı hala CR ve LF'ye saygı duyuyor. Aslında en çok kullanılan sayfa açıklama dilleri için temeldir - PCL ve Postscript.


1
Java ile ilgili not: Genel olarak "\ n veya \ r kullanmamanız" gerektiği doğru değildir. Sadece Java'da, "\ n" her zaman LF ve "\ r" her zaman CR'dir. İstediğiniz tam olarak bu olabilir : Belirli bir satır bitiş stili istiyorsanız, bunları kullanın; Açıkça sen çalışmakta olan bilgisayarın biten yerli çizgi istiyorsanız, o zaman kullanın line.separator. Gerçekten ne istediğine bağlı.
sleske

Ve BTW println()otomatik olarak kullanır line.separator, bu yüzden yerel satır sonlarını istiyorsanız, kullanabilirsiniz println()(ve belirli bir satır sonuna ihtiyaç duyuyorsanız, o zaman kullanmayın, ancak "\ n" vb. Kullanın).
sleske

sleske: İyi puanlar. Buna göre cevabımı güncelleyeceğim.
RedGrittyBrick

1
\nASCII LF'den başka (EBCDIC tabanlı sistemler hariç) bir kontrol karakteri olan diller veya derleyiciler var mı? \nBir dizgede veya karakter anlamında ne anlama geldiğini, onu bir dosyaya veya çıktı aygıtına gönderme etkisine değil.
Keith Thompson,

1
@KeithThompson: Java için: Evet, \nher zaman ASCII (ve Unicode) kod 10'dur, çünkü JLS açıkça öyle diyor (JLS 3.10.6, "Karakter ve Dize Değişmezleri İçin Kaçış Dizileri" - :-) kontrol ettim). Diğer diller için - iyi bir soru.
sleske,

4

Kısacası, yazıcılar için gerekliydi, ancak şimdi işletim sistemleri biraz farklı bir şekilde yapıyor. Çoğu durumda, hem CR hem de LF'yi sadece yapmanız yeterlidir ve \r\nçoğu durumda bu iyi sonuç verir.


Linux sadece görmezden mi geliyor \ryoksa bir tür davranış değişikliğine neden oluyor mu?
Aaron Franke
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.