\ N ve \ r arasındaki fark?


609

\n(Yeni satır) ve \r(satır başı ) arasındaki fark nedir ?

Özellikle, ve arasında pratik farklılıklar var mı? Biri yerine diğerinin kullanılması gereken yerler var mı?\n\r


3
Tüm cevaplar oldukça tahmin edilebilir, ancak \ n ve \ r arasında PRATİK farklılıklar olup olmadığını bilmek isterim. Birinin diğerinin üzerinde kullanılması gereken yerler var mı?
Vlad the Impala

9
evet, sadece LF (satırsonu) içeren metin dosyaları bazı Windows uygulamalarında sonlandırılmış olarak görülmez ve CRLF ile sonlandırılan metin dosyalarında bazı Linus uygulamalarında açılırsa ek karakterler bulunur.
pavium

2
Evet, \ r bazı linux konsol uygulamaları tarafından dönen çizgi animasyon yapmak için kullanılır.
Murali

8
Gerçekten hala normal Mac EOL mi? Eminim "Klasik" Mac içindi, ama OS X'in Unixified olduğunu düşünmüştüm. (Mac'lere ne kadar aşina olduğumu gösterir, ha?)
John Y

11
tarihsel olarak taşıyıcıyı sayfanın sol tarafına taşımak için bir \ n, taşıyıcıyı aşağı taşımak için kullanıldı.
karthik gorijavolu

Yanıtlar:


827

Ascii kodu açısından, 3 - sırasıyla 10 ve 13 oldukları için ;-).

Ama cidden, birçok var:

  • Unix ve tüm Unix benzeri sistemlerde, \nsatır sonu kodudur, \rözel bir şey ifade etmez
  • Sonuç olarak, C ve bir şekilde kopyalayan birçok dilde (uzaktan bile), \nsatır sonu için standart kaçış dizisidir (gerekirse OS'ye özel dizilere / gerektiğinden çevrilir)
  • eski Mac sistemlerinde (OS X öncesi), \rsatır sonu koduydu
  • Windows'ta (ve birçok eski işletim sisteminde), satır sonu kodu \r\nbu sırayla 2 karakterdir
  • (şaşırtıcı ;-) bir sonuç olarak (Windows'tan çok daha eski işletim sistemlerine geri dönme), \r\nİnternet'teki metin formatları için standart satır sonlandırmasıdır
  • elektromekanik teletip benzeri "terminaller" için, \rtaşıyıcının en soldaki durağa (yavaş bir işlem) varana kadar sola geri gitmesini \nemreder, silindire tek bir çizgi (çok daha hızlı bir işlem) sarması için komut verir - bu nedenle her zaman \r Daha önce \n , şaryo hala sola giderken silindirin hareket edebilmesi için! -) Wikipedia'nın daha ayrıntılı bir açıklaması var .
  • ham modunda, (tipik olarak yukarıdaki gibi çift büyük baskı olanlar taklit), karakter modu terminalleri için \rve \norada olarak, imleç açısından hem de dışında (benzer şekilde hareket olan bir taşıyıcı ya da silindir ;-)

Pratikte, bir metin dosyasına yazmanın modern bağlamında, her zaman kullanmalısınız \n(temel çalışma zamanı, garip bir işletim sistemindeyseniz, örneğin Windows ;-). Kullanmanın tek nedeni, \rbir karakter terminaline (veya büyük olasılıkla onu taklit eden bir "konsol penceresi") yazıyorsanız ve yazdığınız bir sonraki satırın, az önce yazdığınız son satırın (bazen goofy için kullanılır) ascii animasyonunun üzerine yazmasını istiyorsanız "örneğin ilerleme çubuklarının etkileri) - bu, GUI'lerin dünyasında oldukça eskidir ;-).


12
Bu yanıttaki tarihe eklemek için: satır hızları saniyede 10 karakterden arttıkça, taşıyıcının geri dönmesi 2 karakterden fazla zaman aldı ve fazladan izin vermek için ekstra zararsız karakterler (genellikle NUL yani \0) eklendi. \nsaati. Bu, işletim sistemi tarafından şeffaf bir şekilde ele alındı, böylece eski kodda herhangi bir iz bulamazsınız.
Mark Ransom

11
Pencereler nasıl 'garip' bir işletim sistemi?
mailmindlin

31
@mailmindlin - "Pencereler 'garip' bir işletim sistemi nasıl?" Cevap: Kolayca sayabildiğimden daha fazla şekilde (çorap giyerken ayak parmaklarına izin verilmez :-). Hayatta kalan diğer tüm işletim sistemleri Unix tabanlı ... Windows bir tane, birçok yönden dışarı. Bu özel Q'nun bağlamında - kanonik çizgi sonu olarak İKİ bayt (\ n \ r) sunan tek şey ... iş parçacığının başka bir yerinde açıklanan eski-tarihsel olanlar dışında hiçbir mantıklı sebep yok ... diğer tüm işletim sistemleri tek bir char a5 satır sonu var (% 99'u + '\ n').
Alex Martelli

1
@nothings gereksiz: Örneğin, e-posta iletilerinin biçimini tanımlayan RFC 2822'nin yerini alan tools.ietf.org/html/rfc5322 .
Keith Thompson

3
Hayatlarının bir noktasında bir tür ayrıştırıcı yazacak herkese küçük bir tavsiye - asla satırların sonunu düzgün bir şekilde ele almayı unutmayın. Sadece \r(Linux kullanıyorum) unuttuğum için oldukça kötü bir deneyim yaşadım . Ayrıştırmaya başladığımda, geçerli bir dosya gibi görünen dosyaları ayrıştırmaya başladım çünkü ayrıştırdığım dosya Windows'da oluşturuldu. : D de bu tüm temel sorun \nveya \ranlamda görünür olan, örneğin a, ., (vb karakterlerdir.
rbaleksandar

122

Tarihsel olarak a \ntaşıyıcıyı aşağı \rtaşımak için, taşıyıcıyı sayfanın sol tarafına geri taşımak için kullanılmıştır.


8
Belki de bir bilgisayar sorusuna çok pratik bir cevap değil, ama tarihsel tidbit benden bir oylama alıyor.
John Y

1
Fiziksel yazım makinenizin yazma kısmını sol aka ittiğinizde benzer olduğunu hayal edin. dönüş.
Jo Smo

2
\ n şaryoyu aşağı hareket ettirmez, kağıdı YUKARI hareket ettirmek için silindiri döndürür.
Roddy

5
Tüm hareketler görecelidir. Kağıt benim dünyam ve ona göre taşıma aşağı doğru hareket ediyor: P
tster

2
FWIW, hala modern sistemlerde bir "Taşıma Dönüş" olabilir. Bu C kodunu göz önünde bulundurun printf("abcdefghijlm\rNOP\n");OpenSuSe üzerinde gcc-8 ile derlenir ve bir terminalde çalıştırıldığında bu çıktı elde edilir NOPdefghijlm. Dizgideki \ r (satırbaşı), imlecin satırın başına (satır başı) hareket etmesine ve \ r (yani "NOP") öğesinin ardından gelen karakterlerin önceden orada olanın üzerine yazılmasına neden olur (yani "abc")! Gibi Sen geri al (\ b) ile benzer "taşıma hareketi" elde edebilirsiniz printf("abcdefghijlm\b\bNOP\n");üretenabcdefghijNOP
GMC

36

İki farklı karakter.

\n Unix metin dosyalarında satır sonu sonlandırıcısı olarak kullanılır

\r Mac metin dosyalarında satır sonu sonlandırıcı olarak kullanılır

\r\n (yani her ikisi de) Windows ve DOS metin dosyalarındaki satırları sonlandırmak için kullanılır.


2
Acorn ve RISC OS gibi ENTER tuşuna bastığınızda \ n \ r satır sonu işaretçisi olarak kullanılan / bulunduğuna dikkat edin.
Anders

9
Açıklığa kavuşturmak için: \rMac'te uzun zamandır satır sonu olmamıştır. Mac OS X'in 2001 yılında piyasaya sürülmesiyle (Unix tabanlı) \nartık kullanılmaktadır.
jbbuckley

3
Ancak yine de bazı uygulamalar var \r- örneğin MS Office 2011 Excel: CSV'yi kaydetme (tüm varsayılan ayarlarla) - \rsatır sonları olan bir ISO-8859-1 kodlu dosyayı kaydedecektir .
CodeBrauer

24

Kimse özel olarak bahsetmediği için (bilmek / hatırlamak için çok mu gençler?) - \r\nDaktilo ve benzeri cihazlar için kullanıldığından şüpheleniyorum .

Çok satırlı daktilo kullanırken yeni bir satır istediğinizde, gerçekleştirmesi gereken iki fiziksel işlem vardı: şaryoyu sayfanın başına (solda, ABD'de) kaydırın ve kağıdı bir çentik yukarı besleyin .

Örneğin, satır yazıcılarında kalın metin yapmanın tek yolu, satır başı olmadan satır başı yapmak ve aynı karakterleri eskilerinin üzerine yazdırmak, böylece daha fazla mürekkep eklemek, böylece daha koyu görünmesini sağlamaktı (kalın) . Mekanik "yeni satır" işlevi bir daktiloda başarısız olduğunda, bu can sıkıcı bir sonuçtu: dikkat etmiyor olsaydınız, önceki metin satırını yazabilirsiniz.


3
Yeni satır için ASCII standardı \ r \ n'dır. (Bell Telephone standartlar komitesinin kontrolünü ele aldığı kısa bir aralığın dışında). Telefon tekeli karşılığında Bell Telephone mesajlaşma işinden (telgraf, teletip) vazgeçti ve standardın mevcut kullanımını umursamadı. HTTP, HTML, PCDOS ve MSDOS ASCII standardını kullanmıştır. Bell Telephone, uyumlu olacak mevcut bir işi olmadığı için unix için standart dışı olmayı seçti.
david

12

Farklı İşletim Sistemleri için iki farklı karakter. Ayrıca bu, iletilmesi TCP/IPgereken verilerin kullanılmasında rol oynar\r\n .

\n Unix

\r Mac

\r\n Windows ve DOS.


10
Bence uygulamalı protokollerle karıştırıyorsunuz, TCP / IP'nin \ n ve \ r hakkında hiçbir fikri yok.
jean-loup

4
TCP / IP \ r \ n kullanımını gerektirmez. Telnet tabanlı çeşitli protokoller, SMTP, POP3, FTP, HTTP, ... dahil olmak üzere gerektirir ...
Lorne Markiz

9

Tamamlamak,

Bir kabuk (bash) komut dosyasında, \rimleci satırın önünde ve elbette \nimleci yeni bir satıra koymak için kullanabilirsiniz.

Örneğin, şunu deneyin:

echo -en "AA--AA" ; echo -en "BB" ; echo -en "\rBB"
  • İlk "yankı" ekranı AA--AA
  • İkinci : AA--AABB
  • Son : BB--AABB

Ancak -enparametre olarak kullanmayı unutmayın .


5

Pencerelerde, \ n sonraki satırın başına gider. \ R, bir sonraki satıra geçmeden geçerli satırın başına gider. Bazı kodları test ettiğim kendi konsol uygulamalarında kullandım ve metnin ekranımın yukarı kaydırıldığını görmek istemiyorum, bu yüzden bir kare hızı ( FPS) yazdırırsam f ("% - 10d \ r", fps); Bu, imleci bir sonraki satıra geçmeden satırın başına döndürür ve ekranda aynı satırda sürekli olarak güncellenirken kaydırılmayacak başka bilgilerim olmasını sağlar (% -10 çıktının en az 10 karakter olduğundan, boşlukla doldurulmuş olarak sonlandırıldığından, bu satır için eski değerlerin üzerine yazılır). Bunun gibi şeyler için oldukça kullanışlı,

Biraz tarih

/ R, geçmişini daktiloya borçlu olan "dönüş" veya "satırbaşı" anlamına gelir. Satır başlangıcında yazdığınız bir satır başı, satır sonunu sağa kaydırdı.

/ N, yine daktilo günlerinden yeni bir satıra geçtiğinizde "yeni satır" anlamına gelir. Gerçi bunun başlangıcına kadar değil, bu yüzden bazı işletim sistemleri hem a / r dönüşü, hem de / n satırsonu ihtiyacını benimsedi, çünkü bir daktilonun yaptığı sipariş buydu. tanıdık olan "satır başı" ifadesinden "Enter" yerine "Dönüş" seçeneğine sahip olmak.


1

Sadece karışıklığa eklemek için, bir tarayıcıdaki bir HTML sayfasında bir TextArea öğesi kullanarak basit bir metin editörü üzerinde çalışıyorum. CR / LF ile ilgili uyumluluk sorunlarıyla ilgili olarak, platformu kontrol etmek için kod yazdım ve platform için geçerli olan yeni satır sözleşmesini kullanın.

Ancak, TextArea'da bulunan gerçek karakterleri kontrol ederken, karakterlere karşılık gelen onaltılık verileri üreten küçük bir JavaScript işlevi aracılığıyla ilginç bir şey keşfettim .

Test için aşağıdaki metni yazdım:

Merhaba Dünya [enter]

Güle güle, Zalim Dünya [gir]

Metin verilerini incelediğimde, elde ettiğim bayt dizisi şuydu:

48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 0a 47 6f 6f 64 62 79 65 2c 20 43 72 75 65 6c 20 57 6f 72 6c 64 0a

Şimdi, buna bakan ve 0a'yı ancak 0d bayt görmeyen çoğu insan, bu çıktının bir Unix / Linux platformunda elde edildiğini düşünüyor. Ancak, işte sürtünme: Windows 7 64 bit'te Google Chrome'da elde ettiğim bu sıra.

Bu nedenle, bir TextArea öğesi kullanıyorsanız ve metni inceliyorsanız, TextArea'nızdan hangi gerçek karakter baytlarının döndürüldüğünden emin olmak için çıktıyı yukarıda yaptığım gibi kontrol edin. Bunun diğer platformlarda veya diğer tarayıcılarda farklılık gösterip göstermediğini henüz görmedim, ancak JavaScript aracılığıyla metin işleme yapıyorsanız ve bu metin işleme platformunu bağımsız hale getirmeniz gerekiyorsa akılda tutulması gerekir.

Yukarıdaki yazılarda yer alan kurallar konsol çıktısı için geçerlidir , ancak HTML öğeleri UNIX / Linux kuralına uygundur. Birisi farklı bir platformda / tarayıcıda başka türlü bulmazsa.


0
#include <stdio.h>

void main()
{
  int countch=0;
  int countwd=1;

  printf("Enter your sentence in lowercase: ");
  char ch='a';
  while(ch!='\r')
  {
    ch=getche();
    if(ch==' ')
      countwd++;
    else
      countch++;
  }

  printf("\n Words = ",countwd);

  printf("Characters = ",countch-1);

  getch();

}

Bu örneği alalım \ n yerine işe yaramaz ve niçin tahmin etmeye çalışalım?


1
Bu, yalnızca MS DOS, DECS TOPS-10, CP / M, RT-11 vb. GİRİŞ tuşuna bastığınızda alt çizgi OS'niz \ r \ n gönderirse çalışır. OS'de: Multic, Unix ve Unix benzeri ( Linux, Minix vb.) BeOS, RISCOS vb ENTER tuşu sadece size \ n karakteri gönderir.
Anders

1
ahh evet eskiden klavyelerin her ikisinde de Return ve Enter. Modern kablosuz klavyem bile eski Returntuşta aşağı ve geri oku gösteriyor (şimdi sayısal tuş takımının Enteroku göstermeyen tuş ile tutarlı olması için "Enter" olarak adlandırılıyor )
hiçbir şey

0

\ N (yeni satır) ve \ r (satır başı) arasındaki fark nedir?

Özellikle, \nve arasında pratik farklılıklar var \rmı? Biri yerine diğerinin kullanılması gereken yerler var mı?


\nNewline için ilgili kaçış dizileriyle kısa bir deney yapmak istiyorum ve\r başı aralarındaki belirgin farkın nerede olduğunu göstermek istiyorum.

Bu sorunun dilden bağımsız olarak sorulduğunu biliyorum. Bununla birlikte, en azından deneyi gerçekleştirmek için bir dile ihtiyacımız var. Benim durumumda, C ++ seçtim, ancak deney genellikle herhangi bir programlama dilinde uygulanacaktır.

Program sadece bir for döngüsü bir döngü için yapılan bir cümle yazdırmak için tekrarlar.


Newline programı:

#include <iostream>

int main(void)
{
    for(int i = 0; i < 7; i++)
    {
       std::cout << i + 1  <<".Walkthrough of the for-loop \n";   // Notice `\n` at the end.
    }
    return 0;
}

Çıktı:

1.Walkthrough of the for-loop
2.Walkthrough of the for-loop
3.Walkthrough of the for-loop
4.Walkthrough of the for-loop
5.Walkthrough of the for-loop
6.Walkthrough of the for-loop
7.Walkthrough of the for-loop

Bu sonucun herhangi bir sistemde sağlanmayacağına dikkat edin, bu C ++ kodunu çalıştırıyorsunuz. Ancak en modern sistemler için çalışacaktır. Daha fazla ayrıntı için aşağıyı okuyun.


Şimdi, aynı program, ancak fark ile, bu \n, \ryazdırma sırasının sonunda ile değiştirilir .

Taşıma iade programı:

#include <iostream>

int main(void)
{
    for(int i = 0; i < 7; i++)
    {
       std::cout << i + 1  <<".Walkthrough of the for-loop \r";   // Notice `\r` at the end.
    }
    return 0;
}

Çıktı:

7.Walkthrough of the for-loop 

Farkın nerede olduğunu fark ettiniz mi? Fark, \rher yazdırma dizisinin sonunda Satır Başı kaçış dizisini kullandığınızda, bu dizinin bir sonraki yinelemesi aşağıdaki metin satırına girmez - Her yazdırma dizisinin sonunda, imleç sonraki satırın * başlangıcına atladı.

Bunun yerine, imleç \rkarakteri kullanmadan önce sonunda bulunduğu satırın başına atladı . - Sonuç, baskı sırasının her yinelemesinde bir öncekinin yerini almasıdır.

* Not: A \nmutlaka aşağıdaki metin satırının başına atlamaz. Bazılarında, genel olarak daha yaşlı olan işletim sistemlerinde, \nyeni satır karakterinin sonucu, yalnızca başlangıçta değil, bir sonraki satırda herhangi bir yere atlaması olabilir. Bu nedenle, bir \r \nsonraki metin satırının başlangıcına ulaşmak için kullanmak için istekte bulunurlar .


Bu deney bize çıktı bağlamında satırsonu ve satır başı arasındaki farkı gösterdi bir baskı dizisinin yinelemesinin .

Girdi hakkında tartışırken programdaki , bazı terminaller / konsollar daha iyi taşınabilirlik, uyumluluk ve bütünlük için dolaylı olarak satır başı yeni satırına dönüştürebilir.

Ancak, birini diğeri için seçme seçeneğiniz varsa veya sadece belirli bir tanesini açıkça kullanmak istiyorsanız veya ihtiyacınız varsa, her zaman amacına uyan ve kesinlikle ayırt etmekle çalışmalısınız.

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.