\ R ve \ n arasındaki fark nedir?


245

Nasıl \rve \nfarklı? Unix vs Windows vs Mac ile ilgili bir şey olduğunu düşünüyorum, ama tam olarak nasıl farklı olduklarını ve regexes aramak / maç için emin değilim.


1
Bunun için bir dil etiketi gerekiyor. Farklı dillerin farklı yorumları vardır '\n'.
Adrian McCarthy

Yanıtlar:


383

Onlar farklı karakterler. \rsatır başı ve \nsatır beslemedir.

"Eski" yazıcılarda, \ryazdırma kafasını satırın başına geri gönderdi \nve 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 \nbir hat ayırıcısı olarak kullanma eğilimindedir ; Windows için kullanmak eğiliminde \r\nbir hat ayırıcı ve (OS 9 kadar) Mac'ler olarak kullanılan kullanmak \rhat ayırıcı olarak. (Mac OS X Unix-y'dir, bu nedenle kullanır \n; \rbunun 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.


22
Yaşlılar için +1. Yüceltilmiş bir elektronik terminali doğrudan kontrol etmek için kullanılan terminal çıkışı (bu süslü CRT ekranlarından önceki TTY'niz). Bu nedenle, satır başı ve yeni satır karakterleri (her ikisi de Jon Skeet'in belirttiği gibi gerekli olabilir) ve \ a "bell", \ b "backspace" ("delete" ile karıştırılmamalıdır) ") ve bir tty ile iletişim kurmak için gereken diğer tüm kontrol karakterleri.
erjiang

35
Yaşlılar için bir +1 daha. Yine de Windows komut isteminde Ctrl + G tuşlarına basabilir, enter tuşuna basarsanız PC hoparlörü bip sesi çıkarır. Bu eski zamanlardan kalmadır.
Dave Carlile

@Crappy Coding Guy gerçekten mi? Vista'da, sadece "" "dahili veya harici bir komut olarak tanınmadı" diyor
Ponkadoodle

2
@AdrianMcCarthy: Elbette soru aslında burada C veya C ++ belirtmiyor . C #, örneğin \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.
Jon Skeet

2
@AdrianMcCarthy: Ama en azından C # ve Java, bu ise satır besleme. Unicode tarafından "LINE FEED" (ve NEW LINE) olarak adlandırılan U + 000A'dır. C ve C ++ özel durumundan bahsetmek için düzenleyeceğim, ancak bunların gerçekten özel durumlar olduğuna inanıyorum , tersi değil.
Jon Skeet

91

C ve C ++ ' \nda bir kavramdır, \rbir 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:

  1. yazdırma kafasını satırın başına getirin, ardından
  2. sonraki satıra taşı.

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:

  • Unix varyantları (Mac'in modern sürümleri dahil), yeni satırı belirtmek için yalnızca bir LF karakteri kullanır.
  • Eski (OSX öncesi) Macintosh dosyaları, yeni satırı belirtmek için yalnızca bir CR karakteri kullandı.
  • VMS, CP / M, DOS, Windows ve birçok ağ protokolü her ikisini de beklemektedir: CR LF.
  • EBCDIC kullanan eski IBM sistemleri NL'de standardize edildi - ASCII karakter setinde bile bulunmayan bir karakter. Unicode'da NL 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 \azili ç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 \aeş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.

\nilgili 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 \nsatı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 \nzaman neredeyse kesinlikle LF olmayacaktır.

Yani, C ve C ++ 'da:

  • \r kelimenin tam anlamıyla bir satırbaşı.
  • \nana bilgisayar platformunun yeni satır semantiğine / metinlerinden çalışma zamanında çevrilen (metin modunda) sihirli bir değerdir .
  • \r\nneredeyse 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.
  • \x0AASCII LF'yi belirtmenin en taşınabilir yoludur, ancak bunu yalnızca ikili modda yapmak istersiniz. Çoğu metin modu uygulaması buna benzer \n.

Python'da <textarea> girişinin nasıl bölüneceğini anlamaya çalışırken bu yazıya rastladım ve \r\naslı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.
Pat Jones

11
  • "\ r" => Dönüş
  • "\ n" => Newline veya Linefeed (anlambilim)

  • Unix tabanlı sistemler bir metin satırını sonlandırmak için yalnızca "\ n" kullanır.

  • Dos, bir metin satırını sonlandırmak için "\ r \ n" kullanır.
  • Bazı diğer makineler sadece bir "\ r" kullanılır. (Commodore, Apple II, OS X öncesi Mac OS vb.)

5

\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.


4

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).


1
Mac OS X sistemleri varsayılan olarak LF kullanır (BSD Unix'e dayandığı için).
dreamlax

3

@Jon Skeet'in cevabına ek olarak:

Geleneksel olarak Windows \ r \ n, Unix \ n ve Mac \ r kullanır, ancak daha yeni Mac'ler unix tabanlı oldukları için \ n kullanır.


2

C # bir dizede \ r \ n kullandıklarını buldum.


2

\ 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 .


1

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)

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.