Teks & alat sehari-hari · Perangkat Teks
CR, LF dan CRLF: dari mana akhiran baris berasal dan mengapa teks yang ditempel terputus
· Latar belakang
akhiran baris pembersihan teks ekspor data
Menjelaskan asal mula teletipe dari pengangkutan kembali dan pengumpanan baris, mengapa sistem operasi memilih konvensi yang berbeda, dan bagaimana pilihan tersebut muncul sebagai baris kosong ganda dan karakter tersesat dalam teks yang ditempel.
Ekspor dengan baris kosong setelah setiap baris — mengapa file dari sistem lain ditempel dengan baris dua kali lebih banyak
Anda menempelkan ekspor tiga baris dan melihat baris kosong setelah setiap rekaman. Sangat menggoda untuk segera menyalahkan Windows CRLF, tetapi area teks yang memenuhi standar biasanya menampilkan jeda baris dalam bentuk yang dinormalisasi. Baris ganda lebih sering berarti bahwa konversi sebelumnya memperlakukan kembali pengangkutan dan umpan baris sebagai dua pemisah independen, atau menyisipkan baris baru tambahan di antara catatan.
Simpan yang asli sampai Anda tahu tahap mana yang mengubahnya. Bandingkan sumber di editor yang dapat menampilkan karakter kontrol, lalu bandingkan jumlah baris yang ditempel. ToolAcre sengaja menerima CRLF, LF dan CR tunggal sebagai satu batas masing-masing, jadi file tiga rekaman yang tidak tersentuh harus menghasilkan tiga baris, bukan enam hanya karena berasal dari Windows.
Baris kosong tambahan merupakan gejala, bukan bukti bahwa CRLF saja yang menyebabkannya
Nama-nama tersebut menggambarkan tindakan fisik pada terminal pencetakan. Pengembalian gerbong memindahkan gerbong ke awal baris saat ini, sementara pengumpan baris memajukan kertas ke baris berikutnya. Itu adalah kontrol terpisah karena mosi mana pun dapat diminta secara independen. ASCII mempertahankannya sebagai karakter kontrol CR pada desimal 13 dan LF pada desimal 10.
Layar modern tidak lagi memindahkan kertas, namun nilai byte tetap ada dalam file, protokol, dan antarmuka pemrograman. Sejarah menjelaskan mengapa CR dan LF bukan tanda baca yang dapat dipertukarkan dan mengapa CRLF merupakan jaringan dua karakter. Ini tidak berarti setiap aplikasi modern memprosesnya secara terpisah; parser biasanya mengenali pasangan tersebut sebagai satu akhiran baris yang logis.
Tiga konvensi — LF di Unix dan macOS modern, CRLF di Windows, CR di Mac OS klasik, dan alasan masing-masing konvensi tampak masuk akal
Sistem Unix dan mirip Unix secara konvensional menggunakan LF untuk akhiran baris, dan macOS modern mengikuti konvensi tersebut. File teks Windows secara konvensional menggunakan CRLF. Mac OS klasik menggunakan CR saja, tetapi Mac OS X mengadopsi fondasi Unix dan LF. Pilihan tersebut tetap terlihat ketika alat bertukar teks biasa tanpa menyetujui normalisasi.
Tidak ada konvensi yang membuat kata-katanya berbeda. Masalah muncul pada batas yang pembacanya mengharapkan hanya satu representasi atau secara naif terpecah pada setiap karakter kontrol. Pengurai garis yang kuat memeriksa CRLF sebagai pasangan sebelum memeriksa CR atau LF tunggal. ToolAcre melakukan hal itu dengan pola yang diurutkan ` | | `, lalu gabungkan keluaran yang diubah dengan LF.
Apa yang terjadi di kotak teks browser — bagaimana jeda baris secara umum dinormalisasi saat ditempel dan di mana karakter yang menyimpang masih muncul
HTML mendefinisikan penanganan khusus untuk jeda baris dalam kontrol teks. Dalam nilai textarea, browser menormalkan CRLF dan hanya CR ke LF dalam nilai yang terbuka, sementara pengiriman formulir dapat menerapkan aturan data formulir untuk jeda baris. Akibatnya, tempel yang terlihat benar di dalam kotak masih dapat diserialkan secara berbeda oleh lapisan lain atau disalin ke perangkat lunak dengan konvensi lain.
CR liar masih dapat muncul ketika teks melewati area teks normal, ketika byte yang lolos seperti karakter literal `\r` ditampilkan, atau ketika parser hanya terbagi pada LF dan membiarkan CR melekat pada setiap bidang. Browser merupakan satu tahap dalam jalurnya, bukan layanan perbaikan universal untuk file, produsen clipboard, API, dan konsumen baris perintah.
Browser menormalkan jeda baris textarea, tetapi format clipboard dan downstream masih berbeda
Baris kosong dan jejak pengangkutan kembali memerlukan diagnosis yang berbeda. Hapus Garis Kosong menghapus baris yang isinya kosong atau spasi setelah ToolAcre mengenali ketiga gaya akhir baris. Garis Pangkas menghilangkan spasi di awal dan akhir dari setiap baris. Karena pemisah ToolAcre menggunakan pemisah CR asli, pemangkasan biasanya tidak diperlukan hanya untuk menghapus pemisah tersebut.
Gunakan pemangkasan hanya ketika ada spasi, tab, atau karakter literal yang tidak digunakan, dan periksa lekukan yang bermakna sebelum mengubahnya. Jika teks berisi `^M` yang terlihat, tentukan apakah pemirsa sedang merender CR sebenarnya atau dua karakter yang dapat dicetak tersebut. Penggantian menyeluruh dapat merusak konten yang dimaksudkan, sedangkan pemeriksaan hitungan sebelum dan sesudah memberikan hasil yang dapat ditinjau.
Hapus baris kosong, perbaiki baris kosong; pemangkasan biasanya tidak diperlukan setelah ToolAcre membagi CR dengan benar
Untuk contoh yang dapat direproduksi, mulailah dengan tiga nama yang representasi perantaranya rusak berisi baris kosong di antara setiap nama: `Ada`, kosong, `Grace`, kosong, `Linus`. Penghitung Kata dan Karakter melaporkan lima baris. Ini adalah masukan yang sengaja digandakan; urutan CRLF asli saja akan dikenali sebagai satu batas dan tidak akan membuat baris kosong tersebut di ToolAcre.
Pilih Hapus Garis Kosong dan hasilnya menjadi tiga baris yang digabungkan dengan LF. Penghitung sekarang harus melaporkan tiga. Jika nilai yang diimpor juga memiliki padding, jalankan Trim Lines secara terpisah dan tinjau hasilnya. Memisahkan operasi tersebut membuktikan kerusakan mana yang diperbaiki setiap tindakan alih-alih menghubungkan setiap pembersihan dengan konversi yang tidak jelas dari teks Windows.
Contoh praktis: bersihkan ekspor yang sengaja digandakan dan verifikasi jumlah baris
Pembersihan akhir baris tidak memperbaiki pembungkusan yang keras, dimana satu kalimat logis sengaja dipecah pada lebar kolom. Menghapus setiap baris baru dari materi itu juga akan menggabungkan paragraf dan item daftar yang sebenarnya. Putuskan apakah batas mewakili rekaman, paragraf, atau pembungkusan visual sebelum menerapkan operasi garis di seluruh blok.
Itu juga tidak mendiagnosis pengkodean karakter. Tanda urutan UTF-8 byte, berlian pengganti, mojibake, dan kegagalan penguraian kode berkaitan dengan bagaimana byte menjadi karakter, bukan apakah CR atau LF memisahkan karakter tersebut menjadi baris. Pertahankan file asli dan identifikasi pengkodeannya dengan alat penyadap file yang sesuai sebelum memperlakukan simbol aneh yang terlihat sebagai akhiran baris.
Kesimpulannya — akhir baris adalah sejarah yang dapat Anda lihat; alat garis dan penghitung pada Text Toolkit memungkinkan Anda memperbaiki gejala dalam hitungan detik
CR, LF dan CRLF adalah kontrol historis dengan konsekuensi kompatibilitas masa kini. Model mental yang paling aman adalah satu garis batas logis dengan beberapa representasi fisik. Hitung catatan, periksa konvensi sumber dan identifikasi tahapan yang memperkenalkan baris kosong atau karakter kontrol yang dipertahankan sebelum menghapus apa pun.
Untuk materi yang ditempel, buka Text Toolkit di `/tools/text/`, catat jumlah baris awal, terapkan Hapus Garis Kosong hanya jika baris kosong benar-benar tidak diinginkan, dan gunakan Garis Pangkas hanya untuk spasi di sekitarnya. Periksa kembali jumlah dan catatan sampel sesudahnya. Audit singkat tersebut mengubah masalah pemformatan yang tidak terlihat menjadi transformasi teks yang terkontrol dan dapat dibalik.