Yanıtlar:
Onlar farklı karakterler. \r
satır başı ve \n
satır beslemedir.
"Eski" yazıcılarda, \r
yazdırma kafasını satırın başına geri gönderdi \n
ve kağıdı bir satır ileri götürdü. Bu nedenle, her ikisi de bir sonraki satıra yazdırmak için gerekliydi.
Açıkçası bu şu anda biraz alakasız olsa da, konsola bağlı olarak \r
, satırın başına geçmek ve mevcut metnin üzerine yazmak için hala kullanabilirsiniz .
Daha da önemlisi, Unix \n
bir hat ayırıcısı olarak kullanma eğilimindedir ; Windows için kullanmak eğiliminde \r\n
bir hat ayırıcı ve (OS 9 kadar) Mac'ler olarak kullanılan kullanmak \r
hat ayırıcı olarak. (Mac OS X Unix-y'dir, bu nedenle kullanır \n
; \r
bunun yerine, kullanılan bazı uyumluluk durumları olabilir .)
Daha fazla bilgi için Wikipedia satırsonu makalesine bakın .
EDIT: Bu dile duyarlıdır. Örneğin, C # ve Java'da, \n
her zaman satır besleme olarak tanımlanan Unicode U + 000A anlamına gelir. C ve C ++ 'da, anlam platforma özgü olduğu için su biraz daha karışıktır. Ayrıntılar için yorumlara bakın.
\n
bir satır (bölüm 2.4.4.4'te) garantilidir. Tabii ki, OP platformu belirlemiş olsaydı iyi olurdu ... Ayrıca, bu ayrıntı düzeyinin sadece farkı soran biri için faydalı olmaktan daha kafa karıştırıcı olacağını düşünüyorum.
C ve C ++ ' \n
da bir kavramdır, \r
bir karakterdir ve \r\n
(neredeyse her zaman) bir taşınabilirlik hatasıdır.
Eski bir teletype düşünün. Yazdırma kafası bir satıra ve bir sütuna yerleştirilmiş. Teletipe yazdırılabilir bir karakter gönderdiğinizde, karakteri geçerli konuma yazdırır ve başlığı bir sonraki sütuna taşır. (Bu, kavramsal olarak bir daktilo ile aynıdır, ancak daktilolar tipik olarak kağıdı yazdırma kafasına göre hareket ettirmiştir.)
Geçerli satırı bitirmek ve bir sonraki satıra başlamak istediğinizde, iki ayrı adım yapmanız gerekiyordu:
ASCII bu eylemleri iki ayrı kontrol karakteri olarak kodlar:
\x0D
(CR) yazdırma kafasını satırın başına taşır. (Unicode bunu kodlar U+000D CARRIAGE RETURN
.)\x0A
(LF) yazdırma kafasını sonraki satıra taşır. (Unicode bunu kodlar U+000A LINE FEED
.)Teletipler ve erken teknoloji yazıcıları günlerinde, insanlar aslında bunların iki ayrı işlem olduğu gerçeğinden yararlandı. Bir CR'yi bir LF tarafından takip etmeden göndererek, önceden yazdırdığınız çizginin üzerine yazdırabilirsiniz. Bu aksanlar, kalın yazı tipi ve alt çizgi gibi efektlere izin verdi. Bazı sistemler, parolaların basılı kopyada görünmesini önlemek için birkaç kez üst baskı yaptı. Erken seri CRT terminallerinde CR, ekranda zaten metin güncellemek için imleç konumunu kontrol etmenin yollarından biriydi.
Ama çoğu zaman, aslında sadece bir sonraki satıra gitmek istediniz. Bazı kontrol karakterleri gerektirmek yerine, bazı sistemler sadece birine ya da diğerine izin verdi. Örneğin:
U+0085 NEXT LINE
, ancak gerçek EBCDIC değeri 0x15
.Farklı sistemler neden farklı yöntemler seçti? Çünkü evrensel bir standart yoktu. Klavyenizde muhtemelen "Enter" yazdığında, eski klavyeler "Return" derdi, bu da Carriage Return için kısaydı. Aslında, bir seri terminalde Return tuşuna basmak aslında CR karakterini gönderir. Bir metin editörü yazıyorsanız, bu karakteri terminalden geldiğinde kullanmak cazip olurdu. Belki de bu yüzden eski Mac'ler sadece CR kullandı.
Artık standartlarımız var, satır sonlarını temsil etmenin daha fazla yolu var . Vahşi doğada son derece nadir olmasına rağmen, Unicode'un yeni karakterleri vardır:
U+2028 LINE SEPARATOR
U+2029 PARAGRAPH SEPARATOR
Unicode gelmeden önce bile, programcılar temel karakter seti hakkında endişelenmeden en yararlı kontrol kodlarını temsil etmenin basit yollarını istediler. C, kontrol kodlarını temsil etmek için birkaç kaçış dizisine sahiptir:
\a
(uyarı için) teletype zilini çalan veya terminalin bip sesini veren\f
(form beslemesi için) sonraki sayfanın başına gider\t
(sekme için) yazdırma kafasını sonraki yatay sekme konumuna taşır(Bu liste kasıtlı olarak eksiktir.)
Bu eşleme derleme zamanında gerçekleşir - derleyici \a
zili çalmak için kullanılan sihirli değeri görür ve koyar.
Bu anımsatıcıların çoğunun ASCII kontrol kodlarıyla doğrudan korelasyonları olduğuna dikkat edin. Örneğin, ile \a
eşleşir 0x07 BEL
. Ana bilgisayar karakter kümesi için ASCII dışında bir şey kullanan bir sistem için bir derleyici yazılabilir (örn., EBCDIC). Belirli anımsatıcılara sahip kontrol kodlarının çoğu, diğer karakter kümelerindeki kontrol kodlarıyla eşlenebilir.
Huzzah! Taşınabilirlik!
Neredeyse. C, printf("\aHello, World!");
hangi zili çalabilir (veya bipler) ve bir mesaj verir yazabilirim . Ancak bir sonraki satıra bir şey yazdırmak istersem, yine de ana bilgisayar platformunun bir sonraki çıkış satırına geçmek için neye ihtiyacı olduğunu bilmem gerekir. CR LF? CR? LF? NL? Başka bir şey? Taşınabilirlik için çok fazla.
C'nin G / Ç için iki modu vardır: ikili ve metin. İkili modda, gönderilen her veri olduğu gibi iletilir. Ancak metin modunda, özel bir karakteri ana bilgisayar platformunun yeni bir satır için ihtiyaç duyduğu her şeye dönüştüren bir çalışma zamanı çevirisi vardır (ya da tam tersi).
Harika, özel karakter ne?
Eh, 's uygulama bağımlı olduğunu da ancak belirtmek için bir uygulama bağımsız bir yolu vardır: \n
. Genellikle "yeni satır karakteri" olarak adlandırılır.
Bu ince, ancak önemli bir nokta: \n
en eşleştirilir derleme zamanında bir için uygulama tanımlı sonra tekrar eşleştirilir (metin modunda) karakter değeri zamanında hareket için temel platform tarafından gerekli gerçek yapısını (ya da karakter dizisi) için sonraki satıra.
\n
ilgili iki eşleme olduğundan, diğer ters eğik çizgi değişmezlerinden farklıdır. Bu iki aşamalı eşleme, çiftten \n
önemli ölçüde farklıdır \r
, bu da CR'ye derleme zamanı eşlemesi (veya altta yatan karakter kümesi ne olursa olsun en benzer kontrol kodu).
Bu, birçok C ve C ++ programcısını açar. Eğer bunların 100'ünü yoklayacak olsaydınız, en az 99'u bunun \n
satır besleme anlamına geldiğini söyleyecektir . Bu tamamen doğru değil. Çoğu (belki de hepsi) C ve C ++ uygulamaları, sihirli ara değer olarak LF kullanır \n
, ancak bu bir uygulama detayıdır. Bir derleyicinin farklı bir değer kullanması mümkündür. Aslında, ana bilgisayar karakter kümesi ASCII'nin bir üst kümesi değilse (örneğin EBCDIC ise), o \n
zaman neredeyse kesinlikle LF olmayacaktır.
Yani, C ve C ++ 'da:
\r
kelimenin tam anlamıyla bir satırbaşı.\n
ana bilgisayar platformunun yeni satır semantiğine / metinlerinden çalışma zamanında çevrilen (metin modunda) sihirli bir değerdir .\r\n
neredeyse her zaman bir taşınabilirlik hatasıdır. Metin modunda, bu, CR'ye ve ardından platformun yeni satır sırasına çevrilir - muhtemelen amaçlanan şey değil. İkili modda, bu CR'ye çevrilir ve ardından LF olmayabilir - muhtemelen amaçlanan şey değil.\x0A
ASCII LF'yi belirtmenin en taşınabilir yoludur, ancak bunu yalnızca ikili modda yapmak istersiniz. Çoğu metin modu uygulaması buna benzer \n
.\r\n
aslında satırları ayrı liste öğelerine düzgün bir şekilde bölebilmemin tek yolu bu. Bunun garip bir HTML yapı olup olmadığını veya Python'un dizeyi nesnemden alma şekliyle ilgisi olup olmadığını merak ediyor request
.
"\ n" => Newline veya Linefeed (anlambilim)
Unix tabanlı sistemler bir metin satırını sonlandırmak için yalnızca "\ n" kullanır.
\r
bir satırın başlangıcını göstermek için kullanılır ve metni oradan değiştirebilir, ör.
main()
{
printf("\nab");
printf("\bsi");
printf("\rha");
}
Bu çıktıyı üretir:
hai
\n
yeni hat içindir.
Kısacası \ r ASCII değeri 13 (CR) ve \ n ASCII değeri 10 (LF) vardır. Mac, satır sınırlayıcı olarak CR kullanır (en azından daha önce yaptım, modern mac'lardan emin değilim), * nix LF kullanır ve Windows her ikisini de kullanır (CRLF).
\ Carriage Return; \ n Yeni Hattır (Hat Besleme) ... her birinin ne anlama geldiği konusunda işletim sistemine bağlıdır. C'deki '\ n' ve '\ r \ n' ... arasındaki fark hakkında daha fazla bilgi için bu makaleyi okuyun .
taşıma dönüş için kullanılır. (ASCII değeri 13'tür) \ n yeni satır için kullanılır. (ASCII değeri 10'dur)
'\n'
.