Apakah browser mengirimkan "\ r \ n" atau "\ n" atau bergantung pada browser?

102

Pertanyaan ini telah mengganggu saya selama jutaan tahun ... setiap kali saya membuat situs web dengan textarea yang memungkinkan multi-baris (seperti "Bio" untuk profil pengguna), saya selalu berakhir dengan menulis kode paranoid berikut:

// C# code sample...
bio = bio.Replace("\r\n", "\n").Replace("\r", "\n");
bio = Regex.Replace(@"\n{2,}", "\n\n");

Jadi, apa yang dikirim browser <textarea name="Bio"></textarea>jika memiliki banyak baris?

Timothy Khouri
sumber
Wow, saya pikir ini adalah pertanyaan aneh yang tidak akan menarik perhatian ... tapi 16 suara dalam 1 jam, gila.
Timothy Khouri
Kalau dipikir-pikir, saya tidak pernah menemukan masalah terkait ini. Jika seseorang memasukkan baris baru, itu ditampilkan sebagai baris baru, di semua OS, di klien MySQL, di browser, dll. Sepertinya ini menyiratkan bahwa sebagian besar perangkat lunak memiliki pandangan yang agak konsisten tentang masalah tersebut. Tentu saja, jika saya akan melakukan sesuatu yang penting dengannya, saya selalu menjadi normal.
Halil Özgür
Masalahnya akan muncul jika saya mengandalkan "\ r \ n", dan kemudian membuat versi "berformat HTML" dari Bio pengguna, dan karena saya tidak pernah menemukan "\ r \ n", saya menggabungkan semuanya satu <p>tag.
Timothy Khouri

Jawaban:

50

Spesifikasi HTTP dan MIME menetapkan bahwa baris header harus diakhiri dengan \ r \ n, tetapi tidak jelas (beberapa orang akan berpendapat bahwa tidak jelas apakah jelas) tentang apa yang harus dilakukan dengan konten TEXTAREA. (Lihat, misalnya, utas ini dari kelompok kerja HTML tentang masalah tersebut.)

Berikut kutipan dari spesifikasi HTTP / 1.1 tentang header pesan:

Terminator baris untuk bidang header pesan adalah CRLF urutan. Namun, kami merekomendasikan bahwa aplikasi, saat mengurai header tersebut, mengenali LF tunggal sebagai terminator baris dan mengabaikan CR di depannya.

Saya pikir itu adalah strategi yang baik secara umum: tegas tentang apa yang Anda hasilkan tetapi liberal dalam apa yang Anda terima. Anda harus berasumsi bahwa Anda akan menerima semua jenis terminator baris. (Perhatikan bahwa selain CRLF dan LF, Mac OS-9 menggunakan CR saja, dan masih ada beberapa di antaranya. Standar Unicode (bagian 5.8) menetapkan berbagai urutan karakter yang harus dikenali sebagai terminator baris; ada daftarnya di sini .)

Ted Hopp
sumber
6
Saya tidak percaya spesifikasi menentukan apa yang dihasilkan oleh textarea.
Mark Thomas
2
@Will: Baca pertanyaan asli lagi. Ini secara khusus menanyakan tentang bagaimana browser menyandikan konten dari a textarea(yang merupakan sesuatu yang tidak dibatasi oleh spesifikasi, atau setidaknya bagian yang dikutip dari Ted).
John Bartholomew
2
@ Mark - Anda benar. Ada banyak perdebatan tentang masalah itu di berbagai forum. (Lihat utas ini dari 1995 dari kelompok kerja HTML.
Ted Hopp
2
Jawaban ini perlu diedit. Ini mulai mengutip spesifikasi HTTP tetapi itu tidak berkaitan dengan textareas.
DuckMaestro
2
Ya, tetapi jawabannya masih dimulai dengan mengutip HTTP, yang merupakan spesifikasi yang salah untuk ditekankan jika disebutkan sama sekali. Kutipan yang Anda sertakan secara khusus membahas "kolom header pesan" tetapi textareatidak dikirim sebagai kolom header pesan. textareas dikodekan ke dalam badan pesan yang berbeda.
DuckMaestro
30

apa yang dikirim browser <textarea></textarea>jika memiliki banyak baris?

Semua browser modern mengirim CRLF ( \r\n). Namun ini bukan sesuatu yang telah distandarisasi secara memuaskan, jadi saya pasti akan mempertimbangkan untuk menormalkan baris baru dari semua teks masukan multi-baris.

Ketika nilai dibaca melalui JavaScript daripada dikirim langsung dari formulir, perilaku browser berbeda. IE dan Opera mengembalikan string dengan CRLF di; Firefox dan WebKit mengembalikan LF. Jadi, segala bentuk yang dikirimkan dengan bantuan JavaScript / XMLHttpRequest kemungkinan besar datang dalam bentuk apa pun.

bobince
sumber
Apakah JavaScript berperilaku secara konsisten pada browser tertentu di seluruh platform? (Misalnya, apakah Firefox mengembalikan string dengan LF pada Windows, Mac, dan platform seluler?)
Ted Hopp
1
@Ted: Perilaku ini konsisten di semua platform di Firefox, Opera, dan WebKit. IE5 / Mac Saya belum menguji, karena sudah lama mati, tapi browser itu memiliki banyak perbedaan dengan IE5 / Win.
bobince