Nhắc nhở - \ r \ n hoặc \ n \ r?


390

Tôi chỉ không thể nhớ những cái đó. Vì vậy, cách đúng đắn để chấm dứt đúng cách các dòng ASCII cũ là gì?


11
Nếu bạn làm điều này, đảm bảo bạn mở các tệp của mình ở chế độ nhị phân . Mặt khác, các luồng tệp C / C ++ tiêu chuẩn sẽ chuyển đổi "\ n" (đối với các tệp văn bản (mặc định)) thành một chuỗi kết thúc cụ thể của chuỗi (ELS). Do đó "\ r \ n" trên windows sẽ chuyển đổi thành "\ r \ r \ n" trên đĩa vật lý. Lưu ý: nếu bạn chỉ sử dụng C / C ++ để đọc lại tệp, bạn sẽ không nhận thấy vì ELS được chuyển đổi trở lại thành "\ n" khi đọc từ tệp.
Martin York

@Martin - Tôi đang ở .net và đang sử dụng (ví dụ này) File.AppendAllText, với "\ r \ n", và tôi chỉ xem qua một tệp và không có bản sao nào ở cuối dòng. Ma thuật?
Daniel Mošmondor

@Daniel: Đáng lẽ tôi phải cụ thể hơn. Các luồng C / C ++ . Khi được liên kết với một tập tin và mở trong chế độ văn bản . Nó cũng phụ thuộc vào cách bạn nhìn vào tệp (sử dụng hexeditor).
Martin York

@Martin - đã sử dụng PSPad ở chế độ hex ...
Daniel Mošmondor

1
Trên bàn phím cổ, phím Enter được gọi là phím Return. Vì vậy, Return trở lại đầu tiên, sau đó Linefeed được tạo ra để đáp ứng. Tất cả đều quá rõ ràng khi bạn có quá nhiều lịch sử.
Đánh dấu tiền chuộc

Câu trả lời:


1084

Tôi sẽ sử dụng từ ' r etur n ' để ghi nhớ, r xuất hiện trước n.


116
Và để nhớ rằng từ được sử dụng là trả lại , hãy nhớ rằng \ r là trả về vận chuyển . Đừng nhớ rằng "Return" là tên của phím trên bàn phím Mac, nếu không bạn có thể nhìn vào bàn phím PC, xem phím có tên "Enter" và nhận sai thứ tự chữ cái!
Rob Kennedy

3
@David Nhưng tôi đã tự hỏi rằng hiệu ứng của \n\r\r\ngiống nhau, không phải chúng có tác dụng tương tự sao? Bạn có thể chỉ cho tôi điểm khác biệt?
Mr.Anubis

7
@ Mr.Anubis nếu bạn có máy in ma trận điểm nhất định , sẽ không có sự khác biệt, vì thứ tự các lệnh không nên quan trọng. Tuy nhiên, trên một số máy in, bạn sẽ nhận được thêm dòng trống hoặc không có tiến bộ nào cả. Và mọi thứ đã nói ở trên áp dụng cho các trình soạn thảo văn bản - chúng sẽ bị nhầm lẫn, các lớp TextStream sẽ bị bệnh, v.v. Lệnh IS quan trọng. :)
Daniel Mošmondor

12
@ DanielMošmondor Ngoài ra, bạn chỉ cần nhớ rằng đơn hàng đó là impoRtaNt. Hoặc là khi bạn hỏi tại SO, ai đó đã đưa cho bạn một RemiNder, mà sau đó bạn đã quên. Hoặc là bạn không thể sử dụng họ của mình như một lời nhắc nhở, bởi vì thứ tự của r và n bị đảo ngược :)
Daniel Daranas

5
@RobKennedy haha ​​bạn biết tôi đã đến đây và đọc về sự trở lại, và nghĩ "tuyệt vời!". Sau đó tôi đọc bình luận của bạn. Bây giờ mỗi khi tôi không thể nhớ khóa nào tôi không nên xem - tôi nhìn vào phím "Enter" của mình và tôi nghĩ "có gì đó không đúng ở đây" ... haha ​​vì nghĩ về nó!
Wayne Uroda

53

Nếu bạn đang sử dụng C #, bạn nên sử dụng Environment.NewLine, theo MSDN, đó là:

Một chuỗi chứa "\ r \ n" cho các nền tảng không phải là Unix hoặc một chuỗi chứa "\ n" cho các nền tảng Unix.


46
Trên thực tế loại này phụ thuộc vào những gì bạn đang làm. Nếu bạn chỉ xuất văn bản đơn giản ra bàn điều khiển hoặc vào một tệp để sử dụng cục bộ, Environment.NewLinethì tốt. Tuy nhiên, nếu bạn đang viết mọi thứ theo định dạng rõ ràng, định dạng cũng có thể xác định dòng mới. Chẳng hạn, giao thức HTTP nói rằng bạn phải sử dụng \r\nlàm đầu cuối dòng cho các tiêu đề, v.v., bất kể nền tảng.
Matti Virkkunen

3
Vâng, đây thực sự là lời khuyên tồi.
IvanP

Đây là lý do tại sao bạn cần thoát các thông điệp web của mình và xây dựng các bài kiểm tra đơn vị để xác minh việc gửi \ r \ n (windows), \ r (mac), \ n (linux) gửi đúng như \ r \ n đến máy chủ web.
TamusJRoyce

37

Dòng mới phụ thuộc vào hệ điều hành của bạn:

DOS & Windows: \r\n 0D0A (hex), 13,10 (decimal)
Unix & Mac OS X: \n, 0A, 10
Macintosh (OS 9): \r, 0D, 13

Thêm chi tiết tại đây: https://ccrma.stanford.edu/~craig/utility/flip/

Khi nghi ngờ, hãy sử dụng bất kỳ trình xem / chỉnh sửa hex phần mềm miễn phí nào để xem cách tập tin mã hóa dòng mới của nó.

Đối với tôi, tôi sử dụng hướng dẫn sau để giúp tôi nhớ: 0D0A = \ r \ n = CR, LF = ca rr iage r eturn, li n e feed


7
Thật kỳ lạ, tôi là một trong những người biết 0D0Atrái tim, nhưng vẫn nhầm lẫn giữa \r\n.
Nyerguds

1
Hoặc, tôi nhớ \ r là vận chuyển trở lại và \ n là thức ăn đường ... nó chỉ là tôi không nhớ thứ tự của chúng, vì vậy nó không giúp đỡ trong việc ghi nhớ cái nào là 0D và cái nào là 0A;)
Nyerguds

20

Trình tự là CR (Trả về vận chuyển) - LF (Nguồn cấp dữ liệu). Ghi nhớ máy in ma trận? Chính xác. Vì vậy - thứ tự đúng là \ r \ n


Tôi nghĩ rằng đây là câu trả lời hợp lý nhất
David Snabel-Caunt

12
LF + CR sẽ làm tương tự CR + LF trên máy in.
ikegami

10
Tôi không đồng ý, @David. Chỉ nghĩ về máy in ma trận điểm (hoặc máy chữ, đối với vấn đề đó, vì chúng là những máy có cỗ xe trở về) là không đủ. Chỉ với thông tin cơ bản về cách họ làm việc, không có lý do gì để nghĩ rằng vấn đề là chúng tôi tiến bộ giấy trước hay sau khi trở về đầu dòng. Cả \ r \ n và \ n \ r đều đặt tờ giấy vào cùng một vị trí.
Rob Kennedy

@ikegami trên hầu hết các máy in, không phải trên tất cả chúng. Họ cũng có công tắc DIP để cấu hình hành vi đó. :)
Daniel Mošmondor

5
Một lý do để đặt nguồn cấp dữ liệu sau khi trả lại vận chuyển là làm giảm tổng thời gian cần thiết - trong khi đầu đang quay về cạnh trái của tờ giấy, trục lăn có thể lập chỉ mục một dòng. Hoạt động dài hơn bắt đầu trước, vì vậy toàn bộ hoạt động hoàn thành trong thời gian cần hoạt động lâu hơn để thực hiện. Chúng tôi đã làm rất nhiều thứ vì những lý do như thế hồi đó; hãy tưởng tượng chờ đợi một vài trăm dòng ở 110 baud ...
Jerry Andrew

8

Trong bất kỳ ngôn ngữ .NET, Environment.NewLinesẽ thích hợp hơn.


Không hoạt động cho các chuỗi liên tục. Khi cần, tốt hơn là không sử dụng hằng số và sử dụng chuỗi tĩnh thay thế;)
TamusJRoyce

5

Hãy cẩn thận với việc này bằng tay.
Trong thực tế tôi sẽ khuyên không nên làm điều này cả.

Trong thực tế, chúng ta đang nói về trình tự kết thúc dòng LTS dành riêng cho nền tảng.

Nếu bạn mở một tệp ở chế độ văn bản (tức là không phải nhị phân) thì các luồng sẽ chuyển đổi "\ n" thành LTS chính xác cho nền tảng của bạn. Sau đó chuyển đổi LTS trở lại "\ n" khi bạn đọc tệp.

Kết quả là nếu bạn in "\ r \ n" sang tệp windows, bạn sẽ nhận được chuỗi "\ r \ r \ n" trong tệp vật lý (có giao diện với trình chỉnh sửa hex).

Tất nhiên đây là nỗi đau thực sự khi chuyển tập tin giữa các nền tảng.

Bây giờ nếu bạn đang ghi vào một luồng mạng thì tôi sẽ làm điều này bằng tay (vì hầu hết các giao thức mạng gọi điều này một cách cụ thể). Nhưng tôi sẽ đảm bảo luồng không thực hiện bất kỳ giải thích nào (vì vậy chế độ nhị phân là phù hợp).


4

\r\n cho Windows sẽ làm tốt


Một đĩa đơn \ncũng hoạt động tốt trên windows, bao gồm cả phiên bản Notepad mới nhất.
André Caron

Tôi nghĩ rằng các biên tập viên hiện đại sẽ phát hiện các kết thúc dòng, vì các hệ điều hành khác nhau sử dụng các kết thúc khác nhau.
David Snabel-Caunt

1
Trên thực tế không phải: Nếu bạn in tệp này thành tệp (tệp std C / C ++ được mở ở chế độ văn bản) trên cửa sổ, tệp vật lý sẽ chứa "\ r \ r \ n" (kiểm tra tệp bằng trình chỉnh sửa hex). Khi bạn đọc lại, "\ r \ n" được chuyển đổi thành một "\ n" duy nhất.
Martin York

2
Trên thực tế, @DavidCaunt, tôi mới thử \ n và nó không hoạt động với notepad trên Win8.
philk

4

Từ Wikipedia (bạn có thể đọc cái nào đúng cho HĐH của bạn tại bài viết đó):

Các hệ thống dựa trên ASCII hoặc một bộ ký tự tương thích sử dụng riêng lẻ (Nguồn cấp dữ liệu, '\ n', 0x0A, 10 theo số thập phân) hoặc CR (Trả về vận chuyển, '\ r', 0x0D, 13 theo số thập phân) hoặc CR theo sau LF (CR + LF, '\ r \ n', 0x0D0A).


3

\r\n

Thật lạ khi nói tôi nhớ nó vì nó trái ngược với máy đánh chữ tôi đã sử dụng.
Chà, nếu bình thường thì tôi không cần phải nhớ nó ...:-)

máy đánh chữ từ wikipedia * Hình ảnh từ Wikipedia

Trong máy đánh chữ khi bạn hoàn thành để số hóa dòng bạn sử dụng cần quay trở lại vận chuyển , trước khi thực hiện cuộn trống, dòng mới và sau khi cho phép bạn vận hành thủ công trở lại vận chuyển .

Bạn có thể nghe từ bản ghi này từ freesound.org âm thanh của việc nạp giấy lúc đầu và vào khoảng -1: 03 giây kể từ khi kết thúc, sau tiếng chuông cảnh báo kết thúc âm thanh của tiếng trống cuộn và sau một trong những chiếc xe trở về.


2

Nếu bạn đang sử dụng C #, tại sao không sử dụng Environment.NewLine? (tôi giả sử bạn sử dụng một số đối tượng người viết tập tin ... chỉ cần vượt qua nó Environment.NewLinevà nó sẽ xử lý đúng trình kết thúc.

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.