Jawaban:
Mereka karakter yang berbeda. \r
adalah carriage return, dan \n
merupakan line feed.
Pada printer "lama", \r
kirim print head kembali ke awal baris, dan \n
lanjutkan kertas dengan satu baris. Karena itu keduanya diperlukan untuk mulai mencetak pada baris berikutnya.
Jelas itu agak tidak relevan sekarang, meskipun tergantung pada konsol Anda mungkin masih dapat digunakan \r
untuk pindah ke awal baris dan menimpa teks yang ada.
Lebih penting lagi, Unix cenderung digunakan \n
sebagai pemisah garis; Windows cenderung digunakan \r\n
sebagai pemisah garis dan Mac (hingga OS 9) digunakan untuk digunakan \r
sebagai pemisah garis. (Mac OS X adalah Unix-y, jadi gunakan \n
sebagai gantinya; Mungkin ada beberapa situasi kompatibilitas di mana \r
digunakan sebagai gantinya.)
Untuk informasi lebih lanjut, lihat artikel baris baru Wikipedia .
EDIT: Ini peka bahasa. Dalam C # dan Java, misalnya, \n
selalu berarti Unicode U + 000A, yang didefinisikan sebagai umpan baris. Dalam C dan C ++ airnya agak lebih keruh, karena artinya khusus untuk platform. Lihat komentar untuk detailnya.
\n
adalah dijamin akan newline (bagian 2.4.4.4). Tentu saja, akan lebih baik jika OP telah menentukan platform ... Selain itu, saya pikir tingkat detail ini akan lebih membingungkan daripada berguna bagi seseorang yang hanya menanyakan perbedaannya.
Dalam C dan C ++, \n
adalah sebuah konsep, \r
adalah sebuah karakter, dan \r\n
(hampir selalu) adalah bug portabilitas.
Pikirkan teletype lama. Print head diposisikan pada garis dan kolom. Saat Anda mengirim karakter yang dapat dicetak ke teletype, karakter itu dicetak pada posisi saat ini dan memindahkan kepala ke kolom berikutnya. (Secara konseptual ini sama dengan mesin tik, kecuali bahwa mesin tik biasanya memindahkan kertas sehubungan dengan print head.)
Ketika Anda ingin menyelesaikan garis saat ini dan mulai pada baris berikutnya, Anda harus melakukan dua langkah terpisah:
ASCII menyandikan tindakan ini sebagai dua karakter kontrol yang berbeda:
\x0D
(CR) memindahkan print head kembali ke awal baris. (Unicode mengkodekan ini sebagai U+000D CARRIAGE RETURN
.)\x0A
(LF) memindahkan print head ke baris berikutnya. (Unicode mengkodekan ini sebagai U+000A LINE FEED
.)Pada zaman teletype dan printer teknologi awal, orang sebenarnya mengambil keuntungan dari kenyataan bahwa ini adalah dua operasi terpisah. Dengan mengirim CR tanpa mengikutinya dengan LF, Anda dapat mencetak lebih dari garis yang sudah Anda cetak. Ini memungkinkan efek seperti aksen, tipe tebal, dan garis bawah. Beberapa sistem mencetak berulang beberapa kali untuk mencegah kata sandi terlihat di hardcopy. Pada terminal CRT serial awal, CR adalah salah satu cara untuk mengontrol posisi kursor untuk memperbarui teks yang sudah ada di layar.
Tetapi sebagian besar waktu, Anda sebenarnya hanya ingin pergi ke baris berikutnya. Daripada membutuhkan pasangan karakter kontrol, beberapa sistem hanya diperbolehkan satu atau yang lain. Sebagai contoh:
U+0085 NEXT LINE
, tetapi nilai EBCDIC yang sebenarnya adalah 0x15
.Mengapa sistem yang berbeda memilih metode yang berbeda? Hanya karena tidak ada standar universal. Di mana keyboard Anda mungkin mengatakan "Enter", keyboard lama digunakan untuk mengatakan "Kembali", yang merupakan kependekan dari Carriage Return. Bahkan, pada terminal serial, menekan Return sebenarnya mengirim karakter CR. Jika Anda menulis editor teks, akan tergoda untuk hanya menggunakan karakter itu ketika datang dari terminal. Mungkin itu sebabnya Mac lama hanya menggunakan CR.
Sekarang kami memiliki standar , ada lebih banyak cara untuk mewakili jeda baris. Meskipun sangat langka di alam liar, Unicode memiliki karakter baru seperti:
U+2028 LINE SEPARATOR
U+2029 PARAGRAPH SEPARATOR
Bahkan sebelum Unicode muncul, para programmer menginginkan cara-cara sederhana untuk mewakili beberapa kode kontrol yang paling berguna tanpa perlu khawatir tentang rangkaian karakter yang mendasarinya. C memiliki beberapa urutan pelarian untuk merepresentasikan kode kontrol:
\a
(untuk peringatan) yang membunyikan bel teletype atau membuat bip terminal\f
(untuk umpan formulir) yang pindah ke awal halaman berikutnya\t
(untuk tab) yang memindahkan print head ke posisi tab horizontal berikutnya(Daftar ini sengaja tidak lengkap.)
Pemetaan ini terjadi pada waktu kompilasi - kompilator melihat \a
dan meletakkan nilai sihir apa pun yang digunakan untuk membunyikan bel.
Perhatikan bahwa sebagian besar mnemonik ini memiliki korelasi langsung dengan kode kontrol ASCII. Misalnya, \a
akan memetakan ke 0x07 BEL
. Kompiler dapat ditulis untuk sistem yang menggunakan sesuatu selain ASCII untuk set karakter host (misalnya, EBCDIC). Sebagian besar kode kontrol yang memiliki mnemonik tertentu dapat dipetakan untuk mengontrol kode dalam rangkaian karakter lain.
Sabas! Portabilitas!
Hampir saja. Dalam C, saya bisa menulis printf("\aHello, World!");
yang membunyikan bel (atau berbunyi bip) dan mengeluarkan pesan. Tetapi jika saya ingin mencetak sesuatu pada baris berikutnya, saya masih perlu tahu apa yang dibutuhkan platform host untuk pindah ke baris output berikutnya. CR LF? CR? LF? NL? Sesuatu yang lain Begitu banyak untuk portabilitas.
C memiliki dua mode untuk I / O: biner dan teks. Dalam mode biner, data apa pun yang dikirim akan dikirim apa adanya. Namun dalam mode teks, ada terjemahan run-time yang mengubah karakter khusus menjadi apa pun yang dibutuhkan platform host untuk baris baru (dan sebaliknya).
Bagus, jadi apa karakter spesialnya?
Nah, bahwa implementasi ini tergantung, juga, tapi ada cara pelaksanaan-independen untuk menentukan hal itu: \n
. Biasanya disebut "karakter baris baru".
Ini adalah poin yang halus tetapi penting: \n
dipetakan pada waktu kompilasi ke nilai karakter yang ditentukan implementasi yang (dalam mode teks) kemudian dipetakan lagi pada saat run time ke karakter aktual (atau urutan karakter) yang diperlukan oleh platform yang mendasari untuk bergerak ke baris berikutnya.
\n
berbeda dari semua literal backslash lainnya karena ada dua pemetaan yang terlibat. Pemetaan dua langkah ini membuat \n
perbedaan yang signifikan dari genap \r
, yang hanya merupakan pemetaan waktu kompilasi ke CR (atau kode kontrol yang paling mirip dalam apa pun karakter yang mendasarinya)
Ini menjebak banyak programmer C dan C ++. Jika Anda melakukan polling 100, setidaknya 99 akan memberi tahu Anda itu \n
berarti umpan baris. Ini tidak sepenuhnya benar. Sebagian besar (mungkin semua) implementasi C dan C ++ menggunakan LF sebagai nilai perantara ajaib untuk \n
, tetapi itu adalah detail implementasi. Layak bagi kompiler untuk menggunakan nilai yang berbeda. Bahkan, jika set karakter host bukan superset ASCII (misalnya, jika itu EBCDIC), maka \n
hampir pasti tidak akan menjadi LF.
Jadi, dalam C dan C ++:
\r
secara harfiah pengembalian kereta.\n
adalah nilai ajaib yang diterjemahkan (dalam mode teks) saat run-time ke / dari semantik baris baru platform host.\r\n
hampir selalu merupakan bug portabilitas. Dalam mode teks, ini akan diterjemahkan ke CR diikuti oleh urutan baris baru platform - mungkin bukan yang dimaksudkan. Dalam mode biner, ini akan diterjemahkan ke CR diikuti oleh beberapa nilai ajaib yang mungkin bukan LF - mungkin bukan yang dimaksudkan.\x0A
adalah cara yang paling portabel untuk menunjukkan LF ASCII, tetapi Anda hanya ingin melakukannya dalam mode biner. Sebagian besar implementasi mode teks akan memperlakukannya seperti itu \n
.\r\n
sebenarnya satu-satunya cara saya bisa membagi baris menjadi elemen daftar yang terpisah. Itu membuat saya bertanya-tanya apakah ini adalah beberapa artefak HTML aneh, atau apakah itu ada hubungannya dengan cara Python menelan string dari request
objek saya .
"\ n" => Baris Baru atau Linefeed (semantik)
Sistem berbasis Unix hanya menggunakan "\ n" untuk mengakhiri baris teks.
\r
digunakan untuk menunjuk ke awal baris dan dapat mengganti teks dari sana, misalnya
main()
{
printf("\nab");
printf("\bsi");
printf("\rha");
}
Menghasilkan output ini:
hai
\n
untuk baris baru.
Singkatnya memiliki nilai ASCII 13 (CR) dan \ n memiliki nilai ASCII 10 (LF). Mac menggunakan CR sebagai pembatas garis (setidaknya, itu pernah terjadi sebelumnya, saya tidak yakin untuk mac modern), * nix menggunakan LF dan Windows menggunakan keduanya (CRLF).
Carriage Return; \ n adalah Baris Baru (Umpan Baris) ... tergantung pada OS untuk setiap arti. Baca artikel ini untuk informasi lebih lanjut tentang perbedaan antara '\ n' dan '\ r \ n' ... dalam C.
digunakan untuk carriage return. (Nilai ASCII adalah 13) \ n digunakan untuk baris baru. (Nilai ASCII adalah 10)
'\n'
.