Bagaimana cara ditangani secara berbeda di Linux dan Windows?

22

Saya pikir \nmenggerakkan jarum ke bawah, dan \rmenggerakkan jarum ke awal garis (rata kiri)? Tapi saya tidak yakin. Jadi, jika saya salah mohon koreksi saya ....

Bagaimanapun, saya diberitahu bahwa Windows dan Linux menangani newlinesdan carriage returnsberbeda. Saya ingin tahu bagaimana mereka menanganinya secara berbeda dan beberapa tempat yang penting untuk diingat. Terimakasih telah menjawab.

千里 ち ゃ ん
sumber
Sejauh ini saya tahu bahwa \r\ntidak apa-apa di Windows tetapi \n\rtidak, dan saya ingat itu karena \r\nakronim untuk perawat terdaftar. Saya juga mendengar bahwa \nitulah yang digunakan orang di Linux dan \rtidak digunakan sendiri untuk tujuan yang sama \r\n. \rdigunakan dalam MacOS yang sangat tua. Saya belum memverifikasi fakta-fakta ini.
千里 ち ゃ ん
4
Jangan panggil mereka \rdan \n, karena cara \npenanganannya tergantung pada di mana Anda menggunakannya. Lebih baik memanggil mereka CRdan LF.
Ignacio Vazquez-Abrams
Ignacio, akronim itu tidak ada artinya bagiku. Apa yang Anda sebut ini: /? OH ... PENGEMBALIAN BARIS dan PENGEMBALIAN KARANG. Terima kasih, sleske.
千里 ち ゃ ん
@ IgnacioVazquez-Abrams Tidak identik dengan LF? Pada setiap ASCII chart, bukankah karakter 13 = \ n = LF?
barlop
1
@barlop: Tidak dalam C saat keluaran di Windows.
Ignacio Vazquez-Abrams

Jawaban:

21

Saya pikir jarum bergerak ke bawah, dan jarum bergerak ke awal garis (rata kiri)? Tapi saya tidak yakin

Ini benar, kurang lebih, tetapi sebagian besar merupakan keingintahuan historis. Awalnya, linefeed (LF) digunakan untuk memajukan kertas dengan satu baris pada printer dan terminal hardcopy ( teleprinters ); carriage return (CR) mengembalikan print head ke awal baris.

Ini mungkin masih bekerja pada printer modern ketika digunakan dalam "mode teks", tetapi tidak ada relevansi saat ini.

Bagaimanapun, saya diberitahu bahwa Windows dan Linux menangani baris baru dan carriage kembali secara berbeda.

Perbedaannya sederhana: perancang OS harus memilih cara untuk mewakili awal baris baru dalam teks dalam file komputer. Untuk berbagai alasan historis, di dunia Unix / Linux satu karakter LF dipilih sebagai penanda baris baru; MS-DOS memilih CR + LF, dan Windows mewarisi ini. Jadi platform yang berbeda menggunakan konvensi yang berbeda.

Dalam praktiknya, ini menjadi masalah yang semakin berkurang. Penanda baris baru benar-benar hanya relevan untuk pogram yang memproses "teks biasa", dan jumlahnya tidak banyak - sebagian besar hanya memengaruhi kode sumber program, file konfigurasi, dan beberapa file teks sederhana dengan dokumentasi. Saat ini sebagian besar program yang menangani jenis file ini (editor, kompiler dll) dapat menangani kedua konvensi baris baru, jadi tidak masalah yang mana yang Anda pilih.

Ada beberapa kasus di mana alat bersikeras pada konvensi baris baru "mereka" (mis. Skrip Unix shell tidak boleh menggunakan CR + LF), dalam hal ini Anda harus menggunakan yang benar.

sleske
sumber
Pertanyaan yang sama: apakah bahasa pemrograman mengenali \n\rdan \nsama? Sebagai contoh, jika saya mem-parsing file teks yang diedit pada PC orang lain dan berisi jeda baris versi Linux dan Windows, apakah akan melakukan preg_matchfor \ndan \n\rmemberikan saya hasil yang berbeda?
千里 ち ゃ ん
@ 千里 ち ゃ ん: Ini benar-benar tergantung pada bahasa pemrograman, kompiler dll. Khususnya, jika Anda menggunakan regex, itu akan tergantung pada mesin regex yang Anda gunakan - beberapa membedakan ujung jalur yang berbeda, beberapa tidak (sebagian besar dapat dikonfigurasi dengan cara apa pun, Aku percaya).
sleske
@ 千里 ち ゃ ん: Jika Anda memiliki pertanyaan tentang bagaimana beberapa sistem / bahasa pemrograman / mesin ekspresi reguler menangani konvensi baris baru yang berbeda, tanyakan saja ini sebagai pertanyaan terpisah.
sleske
Anda seharusnya menulis dengan cara yang salah seperti Anda. Adapun bahasa pemrograman, mereka akan dapat membaca karakter individu dan Anda programmer dapat melihat yang digunakan dalam input, dan Anda programmer juga dapat melakukan apa yang Anda inginkan untuk output. Seperti halnya Anda dapat mengatakan "Tulis ABC diikuti oleh \ r \ r \ r \ n" karakter apa pun yang ingin Anda tempel di akhir! beberapa karakter lain mungkin tidak dapat dicetak dan tidak ada grafis atau apa pun. Mereka mungkin memiliki beberapa fungsi bawaan seperti println, dan apa yang mereka gunakan untuk baris baru mereka akan menjadi satu atau yang lain, itu tidak bisa keduanya.
barlop
@ 千里 ち ゃ ん dan beberapa bahasa pemrograman memungkinkan Anda memilih lnie yang berakhir sebagai pengaturan di salah satu fungsi bawaannya, jadi meskipun dalam fungsi bawaan Anda bisa .. dalam teori tetap. + Seperti yang disebutkan, dalam praktiknya Anda dapat menulis baris apa pun yang Anda inginkan ... meskipun Anda mungkin tidak dapat melakukannya secara efisien seperti dengan fungsi println.
barlop
14

CR dan LF

American Standard Code for Information Interchange (ASCII) mendefinisikan karakter kontrol termasuk CARRIAGE-RETURN (CR) dan LINE-FEED (LF) yang dulu (dan masih) digunakan untuk mengontrol posisi cetak pada printer dengan cara yang dianalogikan dengan mesin tik mekanik yang mendahului printer komputer awal.

Ketergantungan platform

Di Windows, pemisah baris tradisional dalam file teks adalah CR diikuti oleh LF

Dalam sistem Apple Macintosh lama (pra OSX) pemisah garis tradisional dalam file teks adalah CR

Di Unix dan Linux, pemisah baris tradisional dalam file teks adalah LF.

\ n dan \ r

Dalam banyak bahasa pemrograman dan skrip \nberarti "baris baru". Terkadang (tetapi tidak selalu) ini berarti karakter ASCII LINE-FEED (LF), yang, seperti yang Anda katakan, menggerakkan kursor (atau posisi cetak) ke bawah satu baris. Dalam printer atau mesin tik, ini sebenarnya akan memindahkan kertas ke atas satu baris.

Selalu \rberarti karakter ASCII CARRIAGE-RETURN (CR) yang namanya sebenarnya berasal dari mesin tik mekanik di mana ada kunci carriage-return yang menyebabkan roller ("carriage") yang membawa kertas bergerak ke kanan, ditenagai oleh pegas, sejauh itu akan pergi. Dengan demikian mengatur posisi pengetikan saat ini ke margin kiri.

Pemrograman

Dalam beberapa bahasa pemrograman \ndapat berarti urutan karakter tergantung platform yang mengakhiri atau memisahkan baris dalam file teks. Misalnya di Perl, print "\n"menghasilkan urutan karakter yang berbeda di Linux daripada di Windows.

Di Jawa, praktik terbaik, jika Anda ingin menggunakan akhiran garis asli untuk platform runtime, tidak boleh digunakan \natau tidak \rsama sekali. Anda harus menggunakan System.getProperty("line.separator"). Anda harus menggunakan \ndan di \rmana Anda ingin LF dan CR terlepas dari platform (mis. Seperti yang digunakan dalam HTTP, FTP dan protokol komunikasi Internet lainnya).

Unix stty

Dalam shell Unix, sttyperintah dapat digunakan untuk menyebabkan shell menerjemahkan antara berbagai konvensi ini. Misalnya stty -onlcrakan menyebabkan shell menerjemahkan semua LF keluar ke CR LF.

Linux dan OSX mengikuti konvensi Unix

File teks

File teks masih sangat penting dan banyak digunakan. Misalnya, HTML dan XML adalah contoh file teks. Sebagian besar protokol Internet penting, seperti HTTP, mengikuti konvensi file teks dan menyertakan spesifikasi untuk akhir baris.

Printer

Sebagian besar printer selain yang paling murah, masih menghormati CR dan LF. Bahkan mereka mendasar untuk bahasa deskripsi halaman yang paling banyak digunakan - PCL dan Postscript.

RedGrittyBrick
sumber
1
Catatan tentang Java: Secara umum tidak benar bahwa Anda harus "tidak menggunakan \ n atau sama sekali". Hanya saja di Jawa, "\ n" selalu LF, dan "\ r" selalu CR. Ini mungkin yang Anda inginkan: Jika Anda ingin gaya akhir baris tertentu, gunakan; jika Anda ingin secara eksplisit mengakhiri baris asli komputer yang Anda jalankan, maka gunakan line.separator. Itu benar-benar tergantung pada apa yang Anda inginkan.
sleske
Dan BTW, println()secara otomatis digunakan line.separator, jadi jika Anda ingin akhiran garis asli, Anda dapat menggunakan println()(dan jika Anda memerlukan jenis akhir baris tertentu, maka jangan gunakan itu, tetapi gunakan "\ n" dll secara eksplisit).
sleske
@sleske: Poin bagus. Saya akan memperbarui jawaban saya sesuai.
RedGrittyBrick
1
Apakah ada bahasa atau kompiler di mana \nkarakter kontrol selain ASCII LF (selain sistem berbasis EBCDIC)? Saya mengacu pada apa \nartinya dalam string atau karakter literal, bukan pada efek mengirimnya ke file atau perangkat output.
Keith Thompson
1
@KeithThompson: Untuk Java: Ya, \nselalu ASCII (dan Unicode) kode 10, karena JLS mengatakannya secara eksplisit (JLS 3.10.6, "Escape Sequences for Character and String Literals" - Saya memeriksa :-)). Untuk bahasa lain - pertanyaan bagus.
sleske
4

Singkatnya, diperlukan untuk printer, tetapi sekarang OS melakukannya sedikit berbeda. Dalam kebanyakan kasus, baik-baik saja melakukan CR dan LF dengan melakukan \r\ndan dalam kebanyakan kasus, ini akan berfungsi dengan baik.

James Billingham
sumber
Apakah Linux hanya mengabaikan \ratau apakah itu menyebabkan semacam perubahan perilaku?
Aaron Franke