Ký tự nào đại diện cho một dòng mới trong vùng văn bản


87

Chỉ cần nhanh chóng một, nhưng muốn đảm bảo rằng tôi đang nắm bắt các biến thể nền tảng chéo.

Tôi muốn chuyển đổi các dòng mới được nhập vào vùng văn bản thành [dấu phẩy], để đầu ra có thể được biểu diễn trên một dòng duy nhất, câu hỏi của tôi ...

Hiện tại, gửi từ google chrome, khi tôi xem giá trị, tôi thấy nó sử dụng \r\ncho các dòng mới. Nếu tôi thay thế, \r\ntôi biết nó sẽ hoạt động cho chrome trên windows 7, nhưng còn các nền tảng khác, có những biến thể nào về những gì các trình duyệt khác sẽ chèn dưới dạng một dòng mới bên trong vùng văn bản không?


3
để đơn giản hóa: Tất cả các trình duyệt chỉ bao giờ gửi '\ r \ n' để đại diện cho một dòng mới được nhập vào vùng văn bản (Tôi không tạo giá trị theo chương trình, nó chỉ được tạo bởi người dùng trong trình duyệt của họ)
Ninjanoel

Câu trả lời:


105

Theo thông số kỹ thuật HTML, các trình duyệt được yêu cầu chuẩn hóa ngắt dòng trong đầu vào của người dùng đối với CR LF ( \r\n) và tôi không nghĩ rằng bất kỳ trình duyệt nào cũng mắc lỗi này. Tham khảo: điều khoản 17.13.4 Các kiểu nội dung biểu mẫu trong thông số kỹ thuật HTML 4.01.

Trong bản nháp HTML5, tình hình phức tạp hơn, vì chúng cũng xử lý các quy trình bên trong trình duyệt, không chỉ dữ liệu được gửi đến trình xử lý biểu mẫu phía máy chủ khi biểu mẫu được gửi. Theo họ (và thực tiễn trình duyệt), textareagiá trị phần tử tồn tại trong ba biến thể:

  1. giá trị thô do người dùng nhập, không chuẩn hóa; nó có thể chứa cặp CR, LF hoặc CR LF;
  2. giá trị bên trong, được gọi là “giá trị API”, nơi ngắt dòng được chuẩn hóa thành LF (chỉ);
  3. giá trị gửi, trong đó ngắt dòng được chuẩn hóa thành cặp CR LF, theo quy ước Internet.

4
Thông số kỹ thuật HTML 5: w3.org/html/wg/drafts/html/CR/forms.html#the-textarea-element : the user agent should allow the user to edit, insert, and remove text, and to insert and remove line breaks in the form of "LF" (U+000A) characters.
ComFreek

Cảm ơn, bạn đã làm nên ngày của tôi! Tôi đã chỉ nhầm lẫn bởi vì khi tôi gửi nội dung từ textarea trên OSX / chrome, trình duyệt sẽ gửi nó với CR LF ..
starikovs

3
Một câu hỏi khác là tại sao khi bạn nhận được ".length" của textarea, nó chỉ tính CR LF là một ký tự nhưng khi bạn kiểm tra ở phía máy chủ (ví dụ: với PHP strlen), nó sẽ là hai ký tự ...
starikovs

2
Liên kết của @ ComFreek ở trên bị hỏng hôm nay, hãy sử dụng: w3.org/TR/html5/forms.html#the-textarea-element
Glen Mazza

@starikovs, tôi cho rằng điều này đã được trả lời với giá trị bên trong, được gọi là "giá trị API", nơi ngắt dòng được chuẩn hóa thành LF (chỉ); phần. Những gì bạn thấy dưới dạng một ký tự (cụ thể là \n), có thể là những gì được cung cấp bởi "API nội bộ". Không có tài liệu tham khảo, đây chỉ là cơ sở giả định của tôi dựa trên cảm nhận chung
user907860

12

Nói cụ thể về các textareas trong các biểu mẫu web, cho tất cả các textareas, trên mọi nền tảng, \r\nsẽ hoạt động.

Nếu bạn sử dụng bất kỳ thứ gì khác, bạn sẽ gây ra sự cố với việc cắt và dán trên nền tảng Windows.

Dấu ngắt dòng sẽ được trình duyệt windows chuẩn hóa khi biểu mẫu được gửi, nhưng nếu bạn gửi biểu mẫu xuống trình duyệt với \ndấu ngắt dòng, bạn sẽ thấy rằng văn bản sẽ không sao chép và dán chính xác giữa ví dụ notepad và textarea.

Điều thú vị là, mặc dù các Unix dòng cuối ước hạnh phúc \n, tiêu chuẩn trong hầu hết các giao thức mạng dựa trên văn bản bao gồm HTTP, SMTP, POP3, IMAP, và vân vân vẫn là \r\n. Vâng, nó có thể không có nhiều ý nghĩa, nhưng đó là lịch sử và các tiêu chuẩn đang phát triển dành cho bạn!


6

Có vẻ như, theo thông số kỹ thuật HTML5 , thuộc tính giá trị của phần tử textarea sẽ trả về '\ r \ n' cho một dòng mới:

Giá trị của phần tử được xác định là giá trị thô của phần tử với phép biến đổi sau được áp dụng:

Thay thế mọi lần xuất hiện của ký tự "CR" (U + 000D) không theo sau bằng ký tự "LF" (U + 000A) và mọi lần xuất hiện của ký tự "LF" (U + 000A) không đứng trước ký tự "CR" ( Ký tự U + 000D), bởi một chuỗi hai ký tự bao gồm cặp ký tự U + 000D CARRIAGE RETURN "CRLF" (U + 000A).

Theo liên kết tới 'value' làm rõ rằng nó đề cập đến thuộc tính value được truy cập trong javascript:

Các điều khiển biểu mẫu có một giá trị và một độ kiểm tra. (Cái sau chỉ được sử dụng bởi các phần tử đầu vào.) Chúng được sử dụng để mô tả cách người dùng tương tác với điều khiển.

Tuy nhiên, trong tất cả năm trình duyệt chính (sử dụng Windows, 27/11/2015), nếu '\ r \ n' được ghi vào một vùng văn bản, thì '\ r' sẽ bị loại bỏ. (Để kiểm tra: var e = document.createElement ('textarea'); e.value = '\ r \ n'; alert (e.value == '\ n');) Điều này đúng với IE kể từ phiên bản 9. Trước đó, IE đã trả về '\ r \ n' và chuyển đổi cả '\ r' và '\ n' thành '\ r \ n' (đó là thông số kỹ thuật HTML5). Vì vậy ... tôi bối rối.

Để an toàn, thường là đủ để sử dụng '\ r? \ N' trong biểu thức chính quy thay vì chỉ '\ n', nhưng nếu dãy dòng mới phải được biết, có thể thực hiện kiểm tra như trên trong ứng dụng.


Từ cùng một trang, không phải giá trị thu được thông qua JS được gọi là giá trị API?
Anshul

@Anshul - Tôi hiểu ý bạn. Câu hỏi ban đầu là "Hiện tại, đang gửi từ google chrome, khi tôi xem giá trị, tôi thấy nó sử dụng \ r \ n cho các dòng mới ..." Vì vậy, vì nó đang được "gửi", tôi đoán giá trị đang được đọc trên máy chủ. Tôi cho rằng đó là với JS. Dù sao, hy vọng những sự thật tôi đã đăng có ích. Cám ơn bạn đã góp ý.
barncat

@brancat, tôi nghĩ rằng ngôn ngữ máy chủ không quan trọng ở đây. Thông số kỹ thuật HTML5 rất rõ ràng về 2 điều cho a textarea. 1. Nội dung Yêu cầu sẽ chỉ có \ r \ n 2. Giá trị JS sẽ chỉ có \ n bất kể bạn sử dụng \ r, \ r \ n hay \ n trong khi nhập. Nó cũng phù hợp với phát hiện của bạn với IE9 +.
Anshul

5

- Line Feed and 
 Carriage Return

Các thực thể HTML này sẽ chèn một dòng mới hoặc dấu xuống dòng bên trong một vùng văn bản.


11
không thực sự trả lời câu hỏi
cherouvim

2
@cherouvim, tôi không hiểu tại sao bạn lại bỏ phiếu cho câu trả lời này? Bạn đã đọc câu hỏi trên chưa? Xin đừng đưa ra một số câu trả lời sai lầm của bình luận mà không hiểu bất cứ điều gì!
Mahbub

3
@Mahbub: Câu trả lời này hiện đã có 3 phiếu phản đối vì nó không trả lời câu hỏi.
cherouvim

Không trả lời câu hỏi.
Mike Devenney

1
Tôi cũng đang tìm kiếm những gì & # 13; có nghĩa là và câu trả lời này đã giúp tôi, vì vậy đừng cảm thấy tồi tệ, tất cả thông tin đều là thông tin tốt và giúp mọi người vào những thời điểm ngẫu nhiên :)
jackrabbithanna
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.