Perbedaan antara \ n dan \ r?

609

Apa perbedaan antara \n(baris baru) dan \r(carriage return)?

Secara khusus, adakah perbedaan praktis antara \ndan \r? Apakah ada tempat-tempat di mana satu harus digunakan dan bukan yang lain?

eozzy
sumber
3
Semua jawaban cukup dapat diprediksi, tetapi saya akan tertarik untuk mengetahui apakah ada perbedaan PRAKTIS antara \ n dan \ r. Apakah ada tempat di mana satu harus digunakan di atas yang lain?
Vlad the Impala
9
baik, ya, file teks dengan hanya LF (baris baru) tidak akan dianggap dihentikan di beberapa aplikasi Windows, dan file teks yang diakhiri dengan CRLF akan tampak memiliki karakter tambahan jika dibuka di beberapa aplikasi Linus.
Pavium
2
ya, digunakan oleh beberapa aplikasi konsol linux untuk melakukan rotasi animasi baris.
Murali
8
Apakah benar-benar masih Mac EOL yang normal? Saya yakin itu untuk Mac "Klasik", tapi saya pikir OS X telah Unixified. (Menunjukkan betapa akrabnya saya dengan Mac, eh?)
John Y
11
secara historis a \ n digunakan untuk memindahkan carriage ke bawah, sedangkan \ r digunakan untuk memindahkan carriage kembali ke sisi kiri halaman.
karthik gorijavolu

Jawaban:

827

Dalam hal kode ascii, ini 3 - karena masing-masing 10 dan 13 ;-).

Tapi serius, ada banyak:

  • di Unix dan semua sistem mirip Unix, \nadalah kode untuk end-of-line, \rberarti tidak ada yang istimewa
  • sebagai konsekuensinya, dalam C dan sebagian besar bahasa yang entah bagaimana menyalinnya (bahkan dari jarak jauh), \nadalah urutan pelarian standar untuk end of line (diterjemahkan ke / dari urutan spesifik OS sesuai kebutuhan)
  • dalam sistem Mac lama (pra-OS X), \radalah kode untuk end-of-line sebagai gantinya
  • di Windows (dan banyak OS lama), kode untuk end of line adalah 2 karakter \r\n,, dalam urutan ini
  • sebagai konsekuensi (mengejutkan ;-) (mengingat kembali ke OS yang jauh lebih tua dari Windows), \r\nadalah pemutusan garis standar untuk format teks di Internet
  • untuk "terminal" seperti teletype elektromekanis, \rmemerintahkan carriage untuk kembali ke kiri sampai menyentuh pemberhentian paling kiri (operasi lambat), \nmemerintahkan roller untuk menggulung satu baris (operasi yang jauh lebih cepat) - itulah alasan Anda selalu memiliki \r sebelumnya \n , agar roller dapat bergerak saat carriage masih mengarah ke kiri! -) Wikipedia memiliki penjelasan yang lebih terperinci .
  • untuk karakter-mode terminal (biasanya meniru yang mencetak bahkan-lebih tua seperti di atas), dalam mode mentah, \rdan \nbertindak sama (kecuali baik dari segi kursor, karena ada yang tidak ada kereta atau roller ;-)

Dalam praktiknya, dalam konteks modern penulisan ke file teks, Anda harus selalu menggunakan \n(runtime yang mendasarinya akan menerjemahkannya jika Anda menggunakan OS yang aneh, misalnya, Windows ;-). Satu-satunya alasan untuk menggunakan \radalah jika Anda menulis ke terminal karakter (atau lebih mungkin "jendela konsol" meniru itu) dan ingin baris berikutnya Anda menulis untuk menimpa yang terakhir Anda baru saja menulis (kadang-kadang digunakan untuk konyol "ascii animation "efek misalnya progress bar) - ini semakin usang di dunia GUI, meskipun ;-).

Alex Martelli
sumber
12
Untuk menambah riwayat dalam jawaban ini: karena kecepatan garis meningkat dari 10 karakter per detik, perlu waktu lebih dari 2 karakter untuk carriage untuk kembali dan karakter yang tidak berbahaya (biasanya NUL mis. \0) Ditambahkan setelah \nuntuk memungkinkan tambahan waktu. Ini ditangani secara transparan oleh OS sehingga Anda tidak akan menemukan jejaknya dalam kode lama.
Mark Ransom
11
Bagaimana windows sistem operasi 'aneh'?
mailmindlin
31
@mailmindlin - Anda bertanya "Bagaimana windows sistem operasi 'aneh'?". Jawab: lebih dari yang saya bisa menghitung dengan mudah (saat memakai kaus kaki, jadi jari kaki tidak diperbolehkan :-). Semua OS lain yang masih hidup adalah berbasis Unix ... Windows satu-satunya, keluar dengan banyak cara. Dalam konteks Q khusus ini - ini adalah satu-satunya yang menempatkan TWO byte (\ n \ r) sebagai garis akhir kanonik ... tanpa alasan yang masuk akal kecuali yang historis kuno dijelaskan di tempat lain di utas ... setiap OS lainnya memiliki char-a5 line-end (99% + di antaranya `\ n ').
Alex Martelli
1
@nothing diperlukan: Sebagai contoh, tools.ietf.org/html/rfc5322 , yang menggantikan RFC 2822, menentukan format pesan email.
Keith Thompson
3
Sebuah saran kecil untuk semua orang yang akan menulis semacam parser di beberapa titik dalam hidup mereka - jangan pernah lupa untuk menangani dengan benar akhir baris. Saya memiliki pengalaman yang cukup buruk dengan itu hanya karena saya lupa tentang \r(saya menggunakan Linux). Setelah saya mulai mem-parsing apa yang tampaknya menjadi file yang valid parser saya gagal karena file yang saya parsing telah dibuat di Windows. : D Masalah utama dalam semua itu adalah bahwa tidak \natau \rterlihat dalam arti bahwa misalnya a, ., (dll karakter.
rbaleksandar
122

Secara historis a \ndigunakan untuk memindahkan media ke bawah, sementara \ritu digunakan untuk memindahkan media ke sisi kiri halaman.

mengadu
sumber
8
Mungkin bukan jawaban yang sangat praktis untuk pertanyaan komputer, tetapi berita gembira historis mendapat dukungan dari saya.
John Y
1
Bayangkan menjadi serupa ketika Anda mendorong bagian pengetikan dari mesin pengetikan fisik Anda ke kiri alias. kembali.
Jo Smo
2
\ n tidak menggerakkan media ke bawah, ini memutar rol untuk memindahkan kertas ke atas.
Roddy
5
Semua gerakan itu relatif. Kertas itu adalah duniaku, dan relatif terhadap itu, kereta bergerak ke bawah: P
tster
2
FWIW, masih bisa menjadi "Carriage Return" pada sistem modern. Pertimbangkan kode C ini printf("abcdefghijlm\rNOP\n");Dikompilasi dengan gcc-8 pada OpenSuSe dan berjalan pada terminal menghasilkan output ini NOPdefghijlm. Huruf (carriage return) dalam string menghasilkan kursor yang bergerak ke awal baris (carriage) dan karakter mengikuti \ r (yaitu "NOP") menimpa apa yang sebelumnya ada (yaitu "abc")! Anda dapat mencapai "gerakan kereta" yang sama dengan backspace (\ b) seperti printf("abcdefghijlm\b\bNOP\n");yang menghasilkanabcdefghijNOP
GMc
36

Dua karakter berbeda.

\n digunakan sebagai ujung terminator dalam file teks Unix

\r digunakan sebagai terminator ujung-of-line dalam file teks Mac

\r\n (Yaitu keduanya) digunakan untuk mengakhiri baris dalam file teks Windows dan DOS.

pavium
sumber
2
Perhatikan bahwa ada / dulu komputer yang menggunakan \ n \ r sebagai penanda garis akhir saat Anda menekan tombol ENTER, Seperti Acorn dan RISC OS.
Anders
9
Untuk memperjelas: \rsudah lama tidak mengakhiri baris pada Mac. Dengan rilis Mac OS X pada tahun 2001 (yang berbasis Unix), \nsekarang digunakan.
jbbuckley
3
Tetapi masih ada beberapa aplikasi yang menggunakan \r- mis. MS Office 2011 Excel: Menyimpan CSV (dengan semua pengaturan default) - akan menyimpan file yang disandikan ISO-8859-1 dengan \rujung-line.
CodeBrauer
24

Karena tidak ada orang lain yang menyebutkannya secara spesifik (apakah mereka terlalu muda untuk mengetahui / mengingat?) - Saya menduga penggunaan \r\nberasal dari mesin tik dan perangkat serupa.

Saat Anda menginginkan baris baru saat menggunakan mesin tik berkemampuan multi-baris, ada dua tindakan fisik yang harus dilakukan: geser kereta kembali ke awal (kiri, di AS) halaman, dan umpankan kertas satu takik .

Kembali pada zaman pencetak baris, satu-satunya cara untuk melakukan teks tebal, misalnya, adalah melakukan carriage return TANPA baris baru dan mencetak karakter yang sama di atas yang lama, sehingga menambahkan lebih banyak tinta, sehingga membuatnya tampak lebih gelap (dicetak tebal) . Ketika fungsi "baris baru" mekanik gagal dalam mesin tik, ini adalah hasil yang mengganggu: Anda bisa mengetik di atas baris teks sebelumnya jika Anda tidak memperhatikan.

tidak perlu
sumber
3
Standar ASCII untuk baris baru adalah \ r \ n. (Terlepas dari interval singkat ketika Bell Telephone mendapatkan kendali dari komite standar). Sebagai imbalan untuk monopoli telepon, Bell Telephone menyerah bisnis pesan (telegram, teletype), dan tidak peduli tentang penggunaan standar yang ada. HTTP, HTML, PCDOS dan MSDOS menggunakan standar ASCII. Bell Telephone memilih untuk menggunakan non-standar untuk unix karena mereka tidak memiliki bisnis yang kompatibel.
david
12

Dua karakter berbeda untuk Sistem Operasi berbeda. Ini juga memainkan peran dalam data yang dikirimkan TCP/IPyang membutuhkan penggunaan\r\n .

\n Unix

\r Mac

\r\n Windows dan DOS.

a432511
sumber
10
Saya pikir Anda bingung dengan protokol aplikatif, TCP / IP tidak tahu \ n dan \ r.
jean-loup
4
TCP / IP tidak memerlukan penggunaan \ r \ n. Berbagai protokol berdasarkan Telnet memerlukannya, termasuk SMTP, POP3, FTP, HTTP, ...
Marquis of Lorne
9

Untuk menyelesaikan,

Dalam skrip shell (bash), Anda dapat menggunakan \runtuk mengirim kursor, di depan online dan, tentu saja\n untuk meletakkan kursor pada baris baru.

Misalnya, coba:

echo -en "AA--AA" ; echo -en "BB" ; echo -en "\rBB"
  • Tampilan "gema" pertama AA--AA
  • Kedua : AA--AABB
  • Yang terakhir : BB--AABB

Tapi jangan lupa gunakan -ensebagai parameter.

Akarun
sumber
5

Di windows, \ n pindah ke awal baris berikutnya. The bergerak ke awal baris saat ini, tanpa pindah ke baris berikutnya. Saya telah menggunakan aplikasi konsol saya sendiri di mana saya menguji beberapa kode dan saya tidak ingin melihat teks menggulung layar saya, jadi daripada menggunakan \ n setelah mencetak beberapa teks, misalnya, laju bingkai ( FPS), saya akan printf ("% - 10d \ f", fps); Ini akan mengembalikan kursor ke awal baris tanpa pindah ke baris berikutnya dan memungkinkan saya untuk memiliki informasi lain di layar yang tidak dapat digulirkan sementara framerate terus-menerus memperbarui pada baris yang sama (% -10 membuat yakin outputnya setidaknya 10 karakter, dibenarkan kiri sehingga berakhir dengan spasi, menimpa nilai lama untuk baris itu). Ini cukup berguna untuk hal-hal seperti ini,

Sedikit sejarah

/ R adalah singkatan dari "return" atau "carriage return" yang berutang riwayatnya kepada mesin tik. Pengembalian carriage memindahkan carriage Anda ke kanan sehingga Anda mengetik di awal baris.

/ N adalah singkatan dari "baris baru", lagi, dari hari mesin tik Anda pindah ke baris baru. Meskipun demikian, tidak perlu untuk memulainya, itulah sebabnya beberapa OS mengadopsi kebutuhan untuk pengembalian a / r diikuti oleh a / n baris baru, karena itu adalah urutan mesin tik melakukannya. Ini juga menjelaskan komputer 8bit lama yang digunakan untuk memiliki "Kembali" daripada "Enter", dari "carriage return", yang akrab.

Neil Roy
sumber
1

Hanya untuk menambah kebingungan, saya telah mengerjakan editor teks sederhana menggunakan elemen TextArea di halaman HTML di browser. Untuk mengantisipasi masalah kompatibilitas sehubungan dengan CR / LF, saya menulis kode untuk memeriksa platform, dan menggunakan konvensi baris baru mana pun yang berlaku untuk platform.

Namun, saya menemukan sesuatu yang menarik ketika memeriksa yang sebenarnya karakter terkandung dalam TextArea, melalui fungsi JavaScript kecil yang menghasilkan data hex yang sesuai dengan karakter.

Untuk tes, saya mengetikkan teks berikut:

Halo, Dunia [masukkan]

Selamat tinggal, Dunia Kejam [masukkan]

Ketika saya memeriksa data teks, urutan byte yang saya peroleh adalah ini:

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

Sekarang, kebanyakan orang melihat ini, dan melihat 0a tetapi tidak ada 0d byte, akan berpikir bahwa output ini diperoleh pada platform Unix / Linux. Tapi, inilah intinya: urutan ini saya peroleh di Google Chrome pada Windows 7 64-bit.

Jadi, jika Anda menggunakan elemen TextArea dan memeriksa teks, Tinjau output seperti yang telah saya lakukan di atas, untuk memastikan byte karakter aktual apa yang dikembalikan dari TextArea Anda. Saya belum melihat apakah ini berbeda pada platform lain atau browser lain, tetapi perlu diingat jika Anda melakukan pemrosesan teks melalui JavaScript, dan Anda perlu membuat platform pemrosesan teks itu independen.

Konvensi yang dicakup dalam posting di atas berlaku untuk output konsol , tetapi elemen HTML, tampaknya, mematuhi konvensi UNIX / Linux. Kecuali seseorang menemukan sebaliknya pada platform / browser yang berbeda.

David Edwards
sumber
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();

}

mari kita ambil contoh ini mencoba meletakkan \ n di tempat itu tidak akan berhasil dan coba tebak mengapa?

karthik gorijavolu
sumber
1
Ini hanya berfungsi jika OS garis bawah Anda mengirimkan \ r \ n ketika Anda menekan tombol ENTER, seperti MS DOS, DECS TOPS-10, CP / M, RT-11 dll. Dalam OS: seperti multic, Unix dan Unix-like ( Linux, Minix dll.) BeOS, RISCOS dll. Tombol ENTER hanya mengirimi Anda karakter.
Anders
1
ahh ya masa lalu yang baik ketika keyboard dulu memiliki keduanya Returndan Enter. Bahkan keyboard nirkabel yang modern saya masih menunjukkan down-dan-panah kembali di tua Returnkunci (yang sekarang berjudul "Enter" untuk konsisten dengan keypad numerik ini Enterkunci, yang tidak menunjukkan tanda panah)
nothingisnecessary
0

Apa perbedaan antara \ n (baris baru) dan \ r (carriage return)?

Secara khusus, adakah perbedaan praktis antara \ndan \r? Apakah ada tempat-tempat di mana satu harus digunakan dan bukan yang lain?


Saya ingin membuat percobaan singkat dengan urutan pelarian masing-masing \nuntuk baris baru dan\r untuk carriage return untuk menggambarkan di mana perbedaan yang berbeda di antara mereka.

Saya tahu, bahwa pertanyaan ini diajukan sebagai tidak tergantung bahasa. Meskipun demikian, Kami membutuhkan bahasa setidaknya untuk memenuhi percobaan. Dalam kasus saya, saya sudah memilih C ++, tetapi percobaan umumnya akan berlaku dalam bahasa pemrograman apa pun.

Program hanya cukup untuk mencetak kalimat ke konsol, dilakukan dengan iterasi for-loop.


Program baris baru:

#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;
}

Keluaran:

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

Perhatikan, bahwa hasil ini tidak akan diberikan pada sistem apa pun , Anda mengeksekusi kode C ++ ini. Tetapi itu akan bekerja untuk sistem yang paling modern. Baca di bawah untuk detail lebih lanjut.


Sekarang, program yang sama, tetapi dengan perbedaannya, itu \ndiganti dengan \rdi akhir urutan cetak.

Program pengembalian kereta:

#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;
}

Keluaran:

7.Walkthrough of the for-loop 

Melihat perbedaannya? Perbedaannya hanya seperti itu, ketika Anda menggunakan urutan escape escape Carriage\r di akhir setiap urutan cetak, iterasi berikutnya dari urutan ini tidak masuk ke baris teks berikut - Di akhir setiap urutan cetak, kursor tidak melompat ke awal baris berikutnya.

Sebagai gantinya, kursor melompat kembali ke awal baris, di mana ia berada di akhir, sebelum menggunakan \r karakter. - Hasilnya adalah bahwa setiap iterasi berikut dari urutan cetak menggantikan yang sebelumnya.

* Catatan: A \ntidak harus langsung ke awal baris teks berikut. Pada beberapa, secara umum lebih tua, sistem operasi hasil \nkarakter baris baru dapat, bahwa ia melompat ke mana saja di baris berikut, bukan hanya ke awal. Itu sebabnya, mereka perlu menggunakan \r \nuntuk mendapatkan di awal baris teks berikutnya.


Eksperimen ini menunjukkan kepada kita perbedaan antara baris baru dan carriage return dalam konteks output dari iterasi dari urutan cetak.

Saat membahas tentang input dalam suatu program, beberapa terminal / konsol dapat mengubah carriage return menjadi baris baru secara implisit untuk portabilitas, kompatibilitas, dan integritas yang lebih baik.

Tetapi jika Anda memiliki pilihan untuk memilih satu untuk yang lain atau ingin atau perlu secara eksplisit hanya menggunakan yang spesifik, Anda harus selalu beroperasi dengan yang satu, yang sesuai dengan tujuannya dan membedakannya secara ketat.

RobertS mendukung Monica Cellio
sumber