Apa perbedaan antara \n
(baris baru) dan \r
(carriage return)?
Secara khusus, adakah perbedaan praktis antara \n
dan \r
? Apakah ada tempat-tempat di mana satu harus digunakan dan bukan yang lain?
Apa perbedaan antara \n
(baris baru) dan \r
(carriage return)?
Secara khusus, adakah perbedaan praktis antara \n
dan \r
? Apakah ada tempat-tempat di mana satu harus digunakan dan bukan yang lain?
Jawaban:
Dalam hal kode ascii, ini 3 - karena masing-masing 10 dan 13 ;-).
Tapi serius, ada banyak:
\n
adalah kode untuk end-of-line, \r
berarti tidak ada yang istimewa\n
adalah urutan pelarian standar untuk end of line (diterjemahkan ke / dari urutan spesifik OS sesuai kebutuhan)\r
adalah kode untuk end-of-line sebagai gantinya\r\n
,, dalam urutan ini\r\n
adalah pemutusan garis standar untuk format teks di Internet\r
memerintahkan carriage untuk kembali ke kiri sampai menyentuh pemberhentian paling kiri (operasi lambat), \n
memerintahkan 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 .\r
dan \n
bertindak 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 \r
adalah 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 ;-).
\0
) Ditambahkan setelah \n
untuk memungkinkan tambahan waktu. Ini ditangani secara transparan oleh OS sehingga Anda tidak akan menemukan jejaknya dalam kode lama.
\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 \n
atau \r
terlihat dalam arti bahwa misalnya a
, .
, (
dll karakter.
Secara historis a \n
digunakan untuk memindahkan media ke bawah, sementara \r
itu digunakan untuk memindahkan media ke sisi kiri halaman.
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
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.
\r
sudah lama tidak mengakhiri baris pada Mac. Dengan rilis Mac OS X pada tahun 2001 (yang berbasis Unix), \n
sekarang digunakan.
\r
- mis. MS Office 2011 Excel: Menyimpan CSV (dengan semua pengaturan default) - akan menyimpan file yang disandikan ISO-8859-1 dengan \r
ujung-line.
Karena tidak ada orang lain yang menyebutkannya secara spesifik (apakah mereka terlalu muda untuk mengetahui / mengingat?) - Saya menduga penggunaan \r\n
berasal 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.
Dua karakter berbeda untuk Sistem Operasi berbeda. Ini juga memainkan peran dalam data yang dikirimkan TCP/IP
yang membutuhkan penggunaan\r\n
.
\n
Unix
\r
Mac
\r\n
Windows dan DOS.
Untuk menyelesaikan,
Dalam skrip shell (bash), Anda dapat menggunakan \r
untuk 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"
AA--AA
AA--AABB
BB--AABB
Tapi jangan lupa gunakan -en
sebagai parameter.
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.
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.
#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?
Return
dan Enter
. Bahkan keyboard nirkabel yang modern saya masih menunjukkan down-dan-panah kembali di tua Return
kunci (yang sekarang berjudul "Enter" untuk konsisten dengan keypad numerik ini Enter
kunci, yang tidak menunjukkan tanda panah)
Apa perbedaan antara \ n (baris baru) dan \ r (carriage return)?
Secara khusus, adakah perbedaan praktis antara
\n
dan\r
? Apakah ada tempat-tempat di mana satu harus digunakan dan bukan yang lain?
Saya ingin membuat percobaan singkat dengan urutan pelarian masing-masing \n
untuk 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 \n
diganti dengan \r
di 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 \n
tidak harus langsung ke awal baris teks berikut. Pada beberapa, secara umum lebih tua, sistem operasi hasil \n
karakter baris baru dapat, bahwa ia melompat ke mana saja di baris berikut, bukan hanya ke awal. Itu sebabnya, mereka perlu menggunakan \r \n
untuk 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.