Perbedaan antara tipe CR LF, LF dan CR line break?

759

Saya ingin tahu perbedaan (dengan contoh jika mungkin) antara CR break line (LF) (Windows), LF (Unix) dan CR (Macintosh).

eozzy
sumber
9
Sangat mirip, tetapi bukan duplikat yang tepat . \nbiasanya diwakili oleh linefeed, tetapi tidak harus linefeed.
Adrian McCarthy
92
CR dan LF adalah karakter kontrol ASCII dan Unicode sementara \rdan \nmerupakan abstraksi yang digunakan dalam bahasa pemrograman tertentu. Menutup pertanyaan ini menyoroti perbedaan mendasar antara pertanyaan dan melanggengkan kekeliruan informasi.
Adrian McCarthy
5
@AdrianMcCarthy Masalah dengan cara penutupan suara bertindak sebagai jawaban; jawaban yang mengklaim keduanya sama dapat di-downvoting dan kemudian diklik sebagai sangat, sangat salah, tetapi hanya dibutuhkan 4 suara setuju (sebanding dengan upvotes) untuk memiliki penutupan yang sangat salah terjadi, dengan tidak ada cara untuk melawan pemilihan sampai setelah itu terjadi.
Jon Hanna
Perumusan pertanyaan ini memang diakui lebih baik, tetapi untuk semua tujuan praktis pertanyaan yang sama.
Jukka K. Korpela
6
@ JukkaK.Korpela: Tidak, sebenarnya tidak. \ntidak berarti hal yang sama di semua bahasa pemrograman.
Adrian McCarthy

Jawaban:

349

Benar-benar byte yang disimpan dalam file. CRadalah bytecode untuk carriage return (dari zaman mesin tik) dan LFjuga, untuk umpan baris. Itu hanya mengacu pada byte yang ditempatkan sebagai penanda end-of-line.

Informasi lebih lanjut, seperti biasa, di wikipedia .

Peter
sumber
53
Saya pikir itu juga berguna untuk menyebutkan bahwa itu CRadalah karakter pelarian \rdan LFadalah karakter pelarian \n. Selain itu, Wikipedia: Baris Baru .
Robert Vunabandi
1
Dalam kata CR and LF- kata sederhana hanya ujung baris dan baris baru sesuai dengan tautan ini , apakah ini benar?
shaijut
@shaijut CR adalah kependekan dari Carriage Return. Itulah yang mengembalikan kereta pada mesin tik. Jadi, kebanyakan benar.
AliFurkan
763

CR dan LF adalah karakter kontrol, masing-masing diberi kode 0x0D(13 desimal) dan 0x0A(10 desimal).

Mereka digunakan untuk menandai jeda baris dalam file teks. Seperti yang Anda tunjukkan, Windows menggunakan dua karakter urutan CR LF; Unix hanya menggunakan LF dan MacOS lama (pra-OSX MacIntosh) menggunakan CR.

Perspektif historis apokrip:

Seperti ditunjukkan oleh Peter , CR = Carriage Return dan LF = Line Feed , dua ekspresi berakar pada mesin ketik lama / TTY. LF memindahkan kertas ke atas (tetapi menjaga posisi horisontal tetap sama) dan CR membawa kembali "carriage" sehingga karakter berikutnya yang diketik akan berada pada posisi paling kiri di atas kertas (tetapi pada baris yang sama). CR + LF melakukan keduanya, yaitu bersiap untuk mengetik baris baru. Seiring berjalannya waktu oleh semantik fisik kode tidak berlaku, dan karena ruang memori dan floppy disk di premium, beberapa perancang OS memutuskan untuk hanya menggunakan salah satu karakter, mereka hanya tidak berkomunikasi dengan baik satu sama lain; -)

Sebagian besar editor teks modern dan aplikasi berorientasi teks menawarkan opsi / pengaturan, dll. Yang memungkinkan deteksi otomatis konvensi akhir file dan untuk menampilkannya.

mjv
sumber
11
jadi sebenarnya Windows adalah satu-satunya OS yang menggunakan karakter ini dengan benar, Carriage Return, diikuti oleh Line Feed.
Rolf
4
Maka, apakah akurat untuk mengatakan bahwa file teks yang dibuat pada Windows adalah yang paling kompatibel dari ketiganya, yaitu yang paling mungkin ditampilkan pada ketiga subset OS?
Prometheus
3
@Hashim mungkin ditampilkan dengan benar tetapi mencoba menjalankan skrip shell tekstual dengan carriage return biasanya akan menghasilkan kesalahan
Omer
Dalam kata CR and LF- kata sederhana hanya ujung baris dan baris baru sesuai dengan tautan ini , apakah ini benar?
shaijut
Saya telah menemukan bahwa beberapa file gaya Windows ( CR+LF) dapat ditampilkan dengan dua baris baru pada sistem lain. Agaknya editor yang menampilkan teks mendukung Carriage Return dan Line Feed sebagai pembatas baris baru, dan karenanya dapat membuat 2 baris di mana 1 dimaksudkan. Jadi sementara CR+LFmungkin yang paling kompatibel, saya tidak berpikir itu tanpa masalah.
Magnus Bull
459

Ini adalah ringkasan bagus yang saya temukan:

Karakter Carriage Return (CR) ( 0x0D, \r) memindahkan kursor ke awal baris tanpa memajukan ke baris berikutnya. Karakter ini digunakan sebagai karakter baris baru di sistem operasi Commodore dan Early Macintosh (OS-9 dan yang lebih lama).

Karakter Umpan Garis (LF) ( 0x0A, \n) memindahkan kursor ke baris berikutnya tanpa kembali ke awal baris. Karakter ini digunakan sebagai karakter baris baru dalam sistem berbasis UNIX (Linux, Mac OSX, dll)

Urutan End of Line (EOL) ( 0x0D 0x0A, \r\n) sebenarnya adalah dua karakter ASCII, kombinasi dari karakter CR dan LF. Ini memindahkan kursor ke baris berikutnya dan ke awal baris itu. Karakter ini digunakan sebagai karakter baris baru di sebagian besar sistem operasi non-Unix termasuk Microsoft Windows, Symbian OS, dan lainnya.

Sumber

Taylor Leese
sumber
1
Karakter "tab vertikal" menggerakkan kursor ke bawah dan mempertahankan posisi pada garis, bukan karakter LF. LF adalah EOL.
12431234123412341234123
2
@TaylorLeese Apakah / r / n dan / n / r sama?
Vicrobot
175

Karena tidak ada jawaban yang menyatakan hal ini, dirangkum secara ringkas:

Pengembalian Carriage (MAC pre-OSX)

  • CR
  • \ r
  • Kode ASCII 13

Line Line (Linux, MAC OSX)

  • LF
  • \ n
  • Kode ASCII 10

Pengembalian Carriage dan Line Line (Windows)

  • CRLF
  • \ r \ n
  • Kode ASCII 13 dan kemudian kode ASCII 10

Jika Anda melihat kode ASCII dalam format yang aneh, mereka hanyalah angka 13 dan 10 dalam radix / basis yang berbeda, biasanya basis 8 (oktal) atau basis 16 (heksadesimal).

http://www.bluesock.org/~willg/dev/ascii.html

ahnbizcad
sumber
46

Jeff Atwood memiliki posting blog baru-baru ini tentang ini: The Great Newline Schism

Inilah esensi dari Wikipedia :

Urutan CR + LF umum digunakan pada banyak sistem komputer awal yang telah mengadopsi mesin teletype, biasanya ASR33, sebagai perangkat konsol, karena urutan ini diperlukan untuk memposisikan printer-printer tersebut pada awal baris baru. Pada sistem ini, teks sering disusun secara rutin agar kompatibel dengan printer ini, karena konsep driver perangkat yang menyembunyikan detail perangkat keras dari aplikasi belum dikembangkan dengan baik; aplikasi harus berbicara langsung ke mesin teletype dan mengikuti konvensi.Pemisahan kedua fungsi ini menyembunyikan fakta bahwa print head tidak dapat kembali dari paling kanan ke awal baris berikutnya dalam waktu satu karakter. Itu sebabnya urutan selalu dikirim dengan CR terlebih dahulu. Bahkan, seringkali diperlukan untuk mengirim karakter tambahan (CR asing atau NUL, yang diabaikan) untuk memberikan waktu kepala cetak untuk bergerak ke margin kiri. Bahkan setelah teletype digantikan oleh terminal komputer dengan kecepatan baud yang lebih tinggi, banyak sistem operasi masih mendukung pengiriman otomatis karakter pengisi ini, untuk kompatibilitas dengan terminal yang lebih murah yang membutuhkan waktu beberapa karakter untuk menggulir layar.

Manu
sumber
5
+1 Dengan pemahaman sederhana inilah saya selalu mengingat urutan kombinasi itu. Bahkan hari ini kita masih dapat melihat logika mekanis ini di setiap printer inktjet (saya suka mengerti karena saya benci belajar). Trik memori saya yang lain adalah: "mac? Kembali ke pengirim" dan "NewLineFeed" (untuk mengingat NL === LF dan mengingat \ n, karena CR sudah memiliki R dalam singkatannya)
GitaarLAB
3
"Saya ragu ... dua kode kontrol diperlukan untuk pengaturan waktu". Bukan itu yang dikatakannya. Dikatakan bahwa tambahan CR dan NUL ada di sini untuk memberikan waktu agar kembali, bukan CR LF asli.
Julien Rousseau
11
@Adrian Akankah Anda mengambil pengalaman pribadi? 1) Di masa lalu teletype saya, printer yang kami gunakan diperlukan <CR><CR><LF>- jadi tentu saja saya bereksperimen hanya dengan satu <CR>. Aku mengirim <CR><LF>Asetelah garis panjang, dan Anda bisa mendengar yang Adicetak sebelum kereta sepenuhnya kembali.
John Burger
11
@Adrian 2) Jangan lupa, ini ada di era elektro-mekanis, di mana setiap karakter melakukan tepat satu fungsi. Kami sering menekankan kata dengan mencetak garis, lalu mengirim <CR><CR>dan mengetikkan jumlah spasi yang benar, kemudian mencetak kembali kata yang sama: bentuk huruf tebal primitif.
John Burger
3
@Adrian 3) Dan akhirnya, ini menggunakan Baudot (atau kode Murray), bukan ASCII. Lima bit data, antara satu bit awal dan satu setengah stop bit. Bagaimana Anda bisa memiliki setengah sedikit? Dengan menunggu setengah waktu sebelum mulai mengirim karakter berikutnya, untuk memberikan waktu kepala cetak untuk kembali ke tengah.
John Burger
16

CR - ASCII kode 13

LF - ASCII kode 10.

Secara teoritis CR mengembalikan kursor ke posisi pertama (di sebelah kiri). LF mengumpankan satu baris dengan memindahkan kursor satu baris ke bawah. Ini adalah bagaimana di masa lalu Anda mengontrol printer dan monitor mode teks. Karakter-karakter ini biasanya digunakan untuk menandai akhir baris dalam file teks. Sistem operasi yang berbeda menggunakan konvensi yang berbeda. Seperti yang Anda tunjukkan Windows menggunakan kombinasi CR / LF sementara Mac pra-OSX hanya menggunakan CR dan sebagainya.

DmitryK
sumber
7

Sistem berdasarkan ASCII atau set karakter yang kompatibel menggunakan LF (Line feed, 0x0A, 10 dalam desimal) atau CR (Carriage return, 0x0D, 13 dalam desimal) secara individual, atau CR diikuti oleh LF (CR + LF, 0x0D 0x0A); Karakter-karakter ini didasarkan pada perintah printer: Umpan garis menunjukkan bahwa satu baris kertas harus diumpan keluar dari printer, dan carriage return menunjukkan bahwa carriage printer harus kembali ke awal baris saat ini.

Berikut detailnya .

pierrotlefou
sumber
5

Keadaan menyedihkan dari "pemisah rekor" atau "terminator garis" adalah warisan zaman kegelapan komputasi.

Sekarang, kita anggap remeh bahwa apa pun yang ingin kita wakili adalah data terstruktur dan sesuai dengan berbagai abstraksi yang mendefinisikan garis, file, protokol, pesan, markup, apa pun.

Tetapi pada suatu waktu ini tidak sepenuhnya benar. Aplikasi karakter kontrol bawaan dan pemrosesan khusus perangkat. Sistem otak-mati yang membutuhkan CR dan LF sama sekali tidak memiliki abstraksi untuk pemisah rekaman atau terminator saluran. CR diperlukan untuk mendapatkan tampilan teletype atau video untuk kembali ke kolom satu dan LF (hari ini, NL, kode yang sama) diperlukan untuk membuatnya maju ke baris berikutnya. Saya kira ide melakukan sesuatu selain membuang data mentah ke perangkat itu terlalu rumit.

Unix dan Mac sebenarnya menentukan abstraksi untuk garis akhir, bayangkan itu. Sayangnya, mereka menentukan yang berbeda. (Unix, ahem, yang lebih dulu.) Dan tentu saja, mereka menggunakan kode kontrol yang sudah "dekat" dengan SOP

Karena hampir semua perangkat lunak kami saat ini adalah turunan dari Unix, Mac, atau MS yang mengoperasikan SW, kami terjebak dengan kebingungan garis akhir.

DigitalRoss
sumber
1

NL berasal dari EBCDIC NL = x'15 'yang secara logis akan dibandingkan dengan CRLF x'odoa ascii ... ini menjadi jelas ketika memindahkan data secara fisik dari mainframe ke midrange. Bahasa sehari-hari (karena hanya orang-orang misterius yang menggunakan ebcdic) NL telah disamakan dengan CR atau LF atau CRLF

David
sumber