Trình duyệt có gửi “\ r \ n” hoặc “\ n” hay nó phụ thuộc vào trình duyệt?


102

Câu hỏi này đã làm phiền tôi trong một triệu năm ... bất cứ khi nào tôi tạo một trang web với một vùng văn bản cho phép nhiều dòng (chẳng hạn như "Tiểu sử" cho hồ sơ của người dùng), tôi luôn kết thúc bằng cách viết đoạn mã hoang tưởng sau:

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

Vì vậy, những gì trình duyệt gửi cho một <textarea name="Bio"></textarea>nếu nó có nhiều dòng?


Wow, tôi nghĩ đây là một câu hỏi kỳ lạ sẽ không gây được sự chú ý nào ... nhưng 16 phiếu bầu trong 1 giờ, thật điên rồ.
Timothy Khouri

Nghĩ về nó, tôi chưa bao giờ gặp phải một vấn đề liên quan đến điều này. Nếu ai đó nhập dòng mới, nó được hiển thị dưới dạng dòng mới, trong tất cả các hệ điều hành, trong máy khách MySQL, trong trình duyệt, v.v. Có vẻ như điều này ngụ ý rằng hầu hết các phần mềm đều có cách xử lý vấn đề này hơi nhất quán. Tất nhiên, nếu tôi định làm điều gì đó quan trọng với nó, tôi luôn bình thường hóa.
Halil Özgür

Vấn đề sẽ xảy ra nếu tôi dựa vào "\ r \ n" và sau đó đang xây dựng phiên bản "định dạng HTML" của Tiểu sử của người dùng và vì tôi chưa bao giờ gặp phải "\ r \ n", tôi gộp tất cả vào một <p>thẻ.
Timothy Khouri

Câu trả lời:


50

Các thông số HTTPMIME chỉ định rằng các dòng tiêu đề phải kết thúc bằng \ r \ n, nhưng chúng không rõ ràng (một số người cho rằng không rõ ràng nếu chúng rõ ràng) về việc phải làm gì với nội dung của một TEXTAREA. (Ví dụ: xem chuỗi này từ một nhóm làm việc HTML về vấn đề này.)

Đây là trích dẫn từ thông số kỹ thuật HTTP / 1.1 về tiêu đề thư:

Dấu chấm cuối dòng cho các trường tiêu đề thư là chuỗi CRLF. Tuy nhiên, chúng tôi khuyến nghị rằng các ứng dụng, khi phân tích cú pháp các tiêu đề như vậy, hãy nhận ra một LF duy nhất là dấu chấm cuối dòng và bỏ qua CR đứng đầu.

Tôi nghĩ đó là một chiến lược tốt nói chung: nghiêm khắc với những gì bạn sản xuất nhưng phóng khoáng trong những gì bạn chấp nhận. Bạn nên giả định rằng bạn sẽ nhận được tất cả các loại kết thúc đường dây. (Lưu ý rằng ngoài CRLF và LF, Mac OS-9 đã sử dụng CR một mình và vẫn còn một số trong số đó xung quanh. Tiêu chuẩn Unicode (mục 5.8) chỉ định một loạt các chuỗi ký tự nên được công nhận là dấu cuối dòng; có một danh sách chúng ở đây .)


6
Tôi không tin rằng các thông số kỹ thuật chỉ định những gì một textarea tạo ra.
Mark Thomas

2
@Will: Đọc lại câu hỏi ban đầu. Nó hỏi cụ thể về cách trình duyệt mã hóa nội dung của một textarea(đó là thứ mà thông số kỹ thuật, hoặc ít nhất là phần trích dẫn của Ted về nó, không bị ràng buộc).
John Bartholomew

2
@Mark - bạn nói đúng. Có vô số cuộc tranh luận về vấn đề đó trên các diễn đàn khác nhau. (Xem chủ đề này từ năm 1995 từ một nhóm làm việc HTML.
Ted Hopp

2
Câu trả lời này cần được chỉnh sửa. Nó bắt đầu trích dẫn thông số HTTP nhưng điều đó không liên quan đến textareas.
DuckMaestro

2
Tôi đã làm, nhưng câu trả lời vẫn bắt đầu bằng việc trích dẫn HTTP, đây là thông số sai cần nhấn mạnh nếu được đề cập đến. Trích dẫn đi kèm của bạn giải quyết cụ thể "trường tiêu đề thư" nhưng textareakhông được gửi dưới dạng trường tiêu đề thư. textareas được mã hóa vào nội dung thư khác nhau.
DuckMaestro

30

trình duyệt gửi gì <textarea></textarea>nếu nó có nhiều dòng?

Tất cả các trình duyệt hiện đại đều gửi CRLF ( \r\n). Tuy nhiên, đây không phải là thứ đã được tiêu chuẩn hóa một cách thỏa đáng vì vậy tôi chắc chắn sẽ coi việc chuẩn hóa các dòng mới của tất cả văn bản đầu vào nhiều dòng là điều đáng giá.

Khi giá trị được đọc qua JavaScript thay vì được gửi trực tiếp từ biểu mẫu, hành vi của trình duyệt sẽ khác. IE và Opera trả về các chuỗi có CRLF trong; Firefox và WebKit trả về LF. Vì vậy, bất kỳ biểu mẫu nào được gửi với sự trợ giúp của JavaScript / XMLHttpRequest đều có thể ở cả hai dạng.


JavaScript có hoạt động nhất quán trên bất kỳ trình duyệt cụ thể nào trên các nền tảng không? (Ví dụ, không dây trở lại Firefox với LF trên Windows, Mac, và các nền tảng di động?)
Ted Hopp

1
@Ted: Hành vi này nhất quán trên các nền tảng trên Firefox, Opera và WebKit. IE5 / Mac Tôi chưa thử nghiệm, vì nó đã chết từ lâu, nhưng trình duyệt đó có nhiều điểm khác biệt so với IE5 / Win.
bobince
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.