2011-01-28 44 views
25

Tôi đã thấy nhiều nhà phát triển sử dụng các phương pháp khác nhau để chia chuỗi bằng các dòng mới, nhưng tôi nhầm lẫn đó là chính xác: \r\n HOẶC \n chỉ?Là một dòng mới = n OR r n?

+3

Tôi chưa bao giờ thấy '\ n \ r'. Nó thường là '\ r \ n' nếu họ đang sử dụng hai. – icktoofay

+0

Điều này thực sự phụ thuộc vào định dạng của tệp/chuỗi mà bạn đang xử lý. – MrGlass

+2

Có sẵn một hằng số PHP_EOL nếu bạn muốn nhúng (các) ký tự eol hệ thống gốc vào các chuỗi của bạn. Tuy nhiên, không giúp gì nhiều nếu bạn đang xử lý văn bản đến từ các hệ thống khác. –

Trả lời

55

\n được sử dụng cho các hệ thống Unix (bao gồm Linux và OSX).

\r\n được sử dụng chủ yếu trên Windows.

\r được sử dụng trên các máy Mac cũ thực sự.

+0

\ r đôi khi được sử dụng trên các máy Mac hiện tại, tùy thuộc vào trình soạn thảo văn bản. Hầu hết các trình soạn thảo văn bản thuần tuý đều chuyển sang kiểu unix. – ughoavgfhw

+0

Khá đúng. Để cụ thể hơn cho những người không biết, "hầu hết các hệ thống UNIX" sử dụng '\ n' bao gồm Mac OS X. – Wiseguy

+3

Chỉ cần rõ ràng: Mac cũ thực sự ở đây có nghĩa là các chương trình được mã hóa cho OS 9, được khai báo là đã chết 2002. – Yuji

3

Nếu bạn đang lập trình trong PHP, nó rất hữu ích để chia dòng bằng \n và sau đó trim() mỗi dòng (miễn là bạn không quan tâm đến khoảng trắng) để cung cấp cho bạn một "sạch" dòng không phân biệt.

foreach($line in explode("\n", $data)) 
{ 
    $line = trim($line); 
    ... 
} 
22

Câu trả lời nhất định chưa hoàn thành. Trong thực tế, nó cho đến nay hoàn thành mà nó có xu hướng dẫn người đọc tin rằng câu trả lời này là hệ điều hành phụ thuộc khi nó không phải là. Nó cũng không phải là cái gì đó phụ thuộc vào ngôn ngữ lập trình (như một số nhà bình luận đã gợi ý). Tôi sẽ bổ sung thêm thông tin để làm rõ hơn. Thứ nhất, cho phép đưa ra danh sách các biến dòng mới hiện nay (như trong, những gì họ đã từ năm 1999):

  • \r\n chỉ được sử dụng trên Windows Notepad, dòng lệnh DOS, hầu hết các Windows API và trong một số ứng dụng Windows cũ hơn.
  • \n được sử dụng cho tất cả các hệ thống, ứng dụng và Internet khác.

Bạn sẽ nhận thấy rằng tôi đã đưa hầu hết các ứng dụng Windows trong nhóm \n mà có thể hơi gây nhiều tranh cãi nhưng trước khi bạn không đồng ý với tuyên bố này, xin vui lòng lấy một file văn bản định dạng UNIX và thử nó trong 10 web thân thiện của Windows các ứng dụng bạn chọn (không được liệt kê trong các ngoại lệ của tôi ở trên). Tỷ lệ phần trăm trong số họ xử lý nó chỉ là tốt? Bạn sẽ thấy rằng họ (thực tế) tất cả triển khai tự động phát hiện các kết thúc dòng hoặc chỉ sử dụng \n vì, trong khi Windows có thể sử dụng \r\n, Internet sử dụng \n. Do đó, cách tốt nhất là các ứng dụng chỉ sử dụng \n nếu bạn muốn đầu ra của mình thân thiện với Internet.

PHP cũng xác định một ký tự dòng mới có tên là PHP_EOL. Hằng số này được đặt thành chuỗi dòng mới cụ thể của hệ điều hành cho máy PHP đang chạy trên (\r\n cho Windows và \n cho mọi thứ khác). Hằng số này không hữu ích cho các trang web và nên tránh cho đầu ra HTML hoặc để viết hầu hết văn bản vào các tệp. Nó trở nên rất hữu ích khi chúng ta chuyển sang đầu ra dòng lệnh từ các ứng dụng PHP vì nó sẽ cho phép ứng dụng của bạn xuất ra cửa sổ đầu cuối theo cách nhất quán trên tất cả các hệ điều hành được hỗ trợ.

Nếu bạn muốn ứng dụng PHP của bạn để làm việc từ bất kỳ máy chủ chúng được đặt trên, hai điều lớn nhất cần nhớ là bạn nên luôn luôn chỉ cần sử dụng \n trừ khi đó là đầu ra thiết bị đầu cuối (trong trường hợp bạn sử dụng PHP_EOL) bạn cũng nên luôn luôn sử dụng / cho dấu phân cách đường dẫn của bạn (không phải \).

Lời giải thích thậm chí lâu hơn:

Một ứng dụng có thể chọn để sử dụng bất cứ dòng kết thúc nó thích không phụ thuộc vào dòng hệ điều hành mặc định chấm dứt phong cách. Nếu tôi muốn trình soạn thảo văn bản của tôi in một dòng mới mỗi khi nó gặp một khoảng thời gian không khó hơn việc sử dụng \n để đại diện cho một dòng mới vì tôi đang giải thích văn bản như tôi vẫn hiển thị nó. IOW, tôi không quan tâm đến việc đo chiều rộng của mỗi ký tự để nó biết vị trí hiển thị tiếp theo nên rất đơn giản để thêm một câu lệnh nói rằng nếu char hiện tại là một khoảng thời gian thì thực hiện một hành động dòng mới (hoặc nếu nó là a \n rồi hiển thị dấu chấm).

Bên cạnh trình kết thúc rỗng, không có mã ký tự nào là thiêng liêng và khi bạn viết trình soạn thảo văn bản hoặc trình xem bạn có trách nhiệm dịch các bit trong tệp của bạn thành glyphs (hoặc trả về dòng) trên màn hình. Điều duy nhất phân biệt một ký tự điều khiển chẳng hạn như dòng mới từ các ký tự khác là hầu hết các bộ phông chữ không bao gồm chúng (nghĩa là chúng không có sẵn một biểu diễn trực quan).

Điều đó đang được nói, nếu bạn đang làm việc ở mức trừu tượng cao hơn thì có thể bạn không thực hiện điều khiển hộp văn bản của riêng mình. Nếu đây là trường hợp thì bạn đang mắc kẹt với bất kỳ dòng kết thúc mà kiểm soát làm cho có sẵn cho bạn. Ngay cả trong trường hợp này, nó là một vấn đề đơn giản để tự động phát hiện kiểu kết thúc dòng của bất kỳ chuỗi nào và thực hiện chuyển đổi trước khi bạn tải văn bản của mình vào điều khiển và sau đó hoàn tác khi bạn đọc từ điều khiển đó. Có nghĩa là, nếu bạn là một ứng dụng desktop dev và ứng dụng của bạn không nhận ra \n là một dòng mới thì nó không phải là một ứng dụng rất thân thiện và bạn thực sự không có lý do vì nó không khó để làm cho nó đúng cách. Nó cũng có nghĩa là ai đó đã viết Notepad nên xấu hổ về bản thân vì nó thực sự là rất dễ dàng để làm tốt hơn nhiều và rất nhiều người đau khổ thông qua việc sử dụng nó mỗi ngày.

+1

"bạn nên luôn luôn chỉ sử dụng' \ n' trừ khi nó là đầu ra thiết bị đầu cuối "- Tôi nghi ngờ điều này, nhưng điều này rõ ràng về lý do chỉ là những gì tôi đang tìm kiếm. – sfarbota

+0

Bạn đang tắt với tuyên bố "\ n được sử dụng cho tất cả các hệ thống, ứng dụng và Internet khác." Nhiều giao thức Internet yêu cầu kết thúc dòng \ r \ n Tiêu đề Http bắt buộc phải được kết thúc bằng \ r \ n và tiêu đề và thư được tách riêng với \ r \ n – Raatje

+0

Xem thêm HTTP (7230), SMTP (RFC5321), POP3 (RFC1939) và email (RFC2822) có trạng thái PHẢI cho \ r \ n kết thúc dòng – Raatje

Các vấn đề liên quan