Bagaimana \r
dan \n
berbeda? Saya pikir itu ada hubungannya dengan Unix vs Windows vs Mac, tapi saya tidak yakin persis bagaimana mereka berbeda, dan mana yang harus dicari / cocokkan di regex.
special-characters
line-endings
Sam Lee
sumber
sumber
'\n'
.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.sumber
\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 sebagaiU+000D CARRIAGE RETURN
.)\x0A
(LF) memindahkan print head ke baris berikutnya. (Unicode mengkodekan ini sebagaiU+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 adalah0x15
.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 ke0x07 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
.sumber
\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 darirequest
objek saya ."\ n" => Baris Baru atau Linefeed (semantik)
Sistem berbasis Unix hanya menggunakan "\ n" untuk mengakhiri baris teks.
sumber
\r
digunakan untuk menunjuk ke awal baris dan dapat mengganti teks dari sana, misalnyaMenghasilkan output ini:
\n
untuk baris baru.sumber
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).
sumber
Selain jawaban @Jon Skeet:
Secara tradisional Windows telah menggunakan \ r \ n, Unix \ n dan Mac \ r, namun Mac yang lebih baru menggunakan \ n karena berbasis unix.
sumber
di C # saya menemukan mereka menggunakan \ r \ n dalam sebuah string.
sumber
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.
sumber
digunakan untuk carriage return. (Nilai ASCII adalah 13) \ n digunakan untuk baris baru. (Nilai ASCII adalah 10)
sumber