Sự khác biệt giữa \ n và \ r?


609

Sự khác biệt giữa \n(dòng mới) và \r(vận chuyển trở lại) là gì?

Cụ thể, có sự khác biệt thực tế nào giữa \n\rkhông? Có nơi nào nên dùng cái này thay cho cái kia không?


3
Tất cả các câu trả lời đều khá dễ đoán, nhưng tôi muốn biết liệu có bất kỳ sự khác biệt THỰC TIỄN nào giữa \ n và \ r không. Có nơi nào nên dùng cái kia không?
Vlad the Impala

9
vâng, vâng, các tệp văn bản chỉ có LF (dòng mới) sẽ không bị xem là bị chấm dứt trong một số ứng dụng Windows và các tệp văn bản bị chấm dứt bằng CRLF sẽ xuất hiện thêm ký tự nếu được mở trong một số ứng dụng Linus.
pavium

2
có, \ r được một số ứng dụng bảng điều khiển linux sử dụng để thực hiện hoạt ảnh dòng xoay.
Murali

8
Có thực sự vẫn là Mac EOL bình thường? Tôi chắc chắn rằng nó là dành cho máy Mac "Cổ điển", nhưng tôi đã nghĩ OS X đã được Unix hóa. (Cho thấy mức độ quen thuộc của tôi với máy Mac, eh?)
John Y

11
trong lịch sử, một \ n đã được sử dụng để di chuyển cỗ xe xuống, trong khi \ r được sử dụng để di chuyển cỗ xe trở lại phía bên trái của trang.
karthik gorijavolu

Câu trả lời:


827

Về mã ascii, nó là 3 - vì chúng lần lượt là 10 và 13 ;-).

Nhưng nghiêm túc, có rất nhiều:

  • trong Unix và tất cả các hệ thống giống Unix, \nlà mã cho dòng cuối, \rcó nghĩa là không có gì đặc biệt
  • do đó, trong C và hầu hết các ngôn ngữ bằng cách nào đó sao chép nó (thậm chí từ xa), \nlà chuỗi thoát tiêu chuẩn cho cuối dòng (được dịch sang / từ các chuỗi cụ thể của hệ điều hành khi cần)
  • trong các hệ thống Mac cũ (tiền OS X), \rlà mã cho dòng cuối thay thế
  • trong Windows (và nhiều HĐH cũ), mã ở cuối dòng là 2 ký tự \r\n, theo thứ tự này
  • như một hậu quả (đáng ngạc nhiên ;-) (trở lại với các HĐH cũ hơn nhiều so với Windows), \r\nlà chấm dứt dòng tiêu chuẩn cho các định dạng văn bản trên Internet
  • đối với các "thiết bị đầu cuối" giống như điện cơ, \rra lệnh cho cỗ xe quay ngược về bên trái cho đến khi chạm vào điểm dừng ngoài cùng bên trái (thao tác chậm), \nra lệnh cho con lăn cuộn lên một dòng (hoạt động nhanh hơn nhiều) - đó là lý do bạn luôn có \r trước đây \n , để con lăn có thể di chuyển trong khi cỗ xe vẫn đi về phía trái! -) Wikipedia có lời giải thích chi tiết hơn .
  • cho thiết bị đầu cuối chế độ ký tự (thường bắt chước những người in thậm chí-già như trên), trong chế độ thô, \r\nđóng vai trò tương tự (trừ cả về con trỏ, như có không có xe ngựa hoặc con lăn ;-)

Trong thực tế, trong bối cảnh hiện đại của việc ghi vào một tệp văn bản, bạn nên luôn luôn sử dụng \n(thời gian chạy bên dưới sẽ dịch rằng nếu bạn đang sử dụng một hệ điều hành kỳ lạ, ví dụ: Windows ;-). Lý do duy nhất để sử dụng \rlà nếu bạn đang viết cho thiết bị đầu cuối ký tự (hoặc nhiều khả năng là "cửa sổ giao diện điều khiển" mô phỏng nó) và muốn dòng tiếp theo bạn viết để ghi đè lên cái cuối cùng bạn vừa viết (đôi khi được sử dụng cho hoạt hình ascii "ngớ ngẩn" "Hiệu ứng của các thanh tiến trình) - tuy nhiên, điều này đang trở nên khá lỗi thời trong một thế giới GUI, tuy nhiên ;-).


12
Để thêm vào lịch sử trong câu trả lời này: khi tốc độ dòng tăng từ 10 ký tự mỗi giây, phải mất hơn 2 ký tự để cỗ xe trở lại và thêm các ký tự vô hại (thường là NUL \0) được thêm vào sau khi \ncho phép thêm thời gian. Điều này đã được HĐH xử lý một cách minh bạch để bạn không tìm thấy bất kỳ dấu vết nào của nó trong mã kế thừa.
Đánh dấu tiền chuộc

11
Làm thế nào là windows một hệ điều hành 'kỳ lạ'?
mailmindlin

31
@mailmindlin - bạn hỏi "Windows là một hệ điều hành 'lạ' như thế nào?". Trả lời: bằng nhiều cách hơn tôi có thể dễ dàng đếm (trong khi mang vớ, vì vậy ngón chân không được phép :-). Tất cả các hệ điều hành còn tồn tại khác đều dựa trên Unix ... Windows là một trong số đó, CÁCH ra theo nhiều cách. Trong ngữ cảnh của Q cụ thể này - đó là lần duy nhất đặt TWO byte (\ n \ r) làm đầu cuối chính tắc ... không có lý do hợp lý nào ngoại trừ các lịch sử cổ đại được giải thích ở đâu đó trên luồng ... mọi hệ điều hành khác có một đầu cuối char a5 (99% + trong số đó `\ n ').
Alex Martelli

1
@nothisn cần thiết: Ví dụ: tools.ietf.org/html/rfc5322 , đã thay thế RFC 2822, xác định định dạng của thông điệp email.
Keith Thompson

3
Một lời khuyên nhỏ cho tất cả những người sẽ viết một trình phân tích cú pháp nào đó vào một lúc nào đó trong cuộc sống của họ - đừng bao giờ quên xử lý đúng cách kết thúc các dòng. Tôi đã có một số trải nghiệm khá khó chịu với điều đó chỉ vì tôi quên mất \r(Tôi đang sử dụng Linux). Khi tôi bắt đầu phân tích cú pháp dường như là một tệp hợp lệ, trình phân tích cú pháp của tôi không thành công vì tệp tôi đang phân tích cú pháp đã được tạo trong Windows. : D Vấn đề chính trong tất cả những gì là không \nhay \rcó thể nhìn thấy theo nghĩa là ví dụ a, ., (, vv nhân vật.
rbaleksandar

122

Trong lịch sử, a \nđược sử dụng để di chuyển cỗ xe xuống, trong khi đó \rđược sử dụng để di chuyển cỗ xe trở lại phía bên trái của trang.


8
Có lẽ không phải là một câu trả lời thực tế khủng khiếp cho một câu hỏi máy tính, nhưng dù sao thì câu chuyện lịch sử vẫn nhận được sự ủng hộ từ tôi.
John Y

1
Hãy tưởng tượng \ r tương tự như khi bạn đẩy phần gõ của máy gõ vật lý sang trái aka. trở về.
Jo Smo

2
\ n không di chuyển cỗ xe xuống, nó quay con lăn để di chuyển giấy LÊN.
Roddy

5
Tất cả các phong trào là tương đối. Giấy được đưa vào thế giới của tôi, và tương ứng với nó, việc vận chuyển được di chuyển xuống: P
tster

2
FWIW, \ r vẫn có thể là "Vận chuyển trở lại" trên các hệ thống hiện đại. Xem xét mã C này printf("abcdefghijlm\rNOP\n");Được biên dịch với gcc-8 trên OpenSuSe và chạy trên một thiết bị đầu cuối dẫn đến kết quả đầu ra này NOPdefghijlm. \ R (trả về vận chuyển) trong chuỗi dẫn đến việc con trỏ di chuyển đến đầu dòng (vận chuyển) và các ký tự theo sau \ r (tức là "NOP") ghi đè lên những gì trước đó (ví dụ "abc")! Bạn có thể đạt được "chuyển động xe ngựa" tương tự với backspace (\ b) như trong printf("abcdefghijlm\b\bNOP\n");sản xuấtabcdefghijNOP
GMc

36

Hai nhân vật khác nhau.

\n được sử dụng như một bộ kết thúc cuối dòng trong các tệp văn bản Unix

\r được sử dụng như một bộ kết thúc cuối dòng trong các tệp văn bản Mac

\r\n (tức là cả hai) được sử dụng để chấm dứt các dòng trong tệp văn bản Windows và DOS.


2
Lưu ý rằng có / là các máy tính đã sử dụng \ n \ r làm điểm cuối của dòng đánh dấu khi bạn nhấn phím ENTER, như Acorn và RISC OS.
Anders

9
Để làm rõ: \rđã không phải là dòng kết thúc trên máy Mac trong một thời gian dài. Với việc phát hành Mac OS X vào năm 2001 (dựa trên Unix), \nhiện đã được sử dụng.
jbbuckley

3
Nhưng vẫn còn một số ứng dụng sử dụng \r- ví dụ: MS Office 2011 Excel: Lưu CSV (với tất cả các cài đặt mặc định) - sẽ lưu tệp được mã hóa ISO-8859-1 với \rkết thúc -line.
CodeBrauer

24

Vì không ai khác đề cập cụ thể (họ còn quá trẻ để biết / nhớ?) - Tôi nghi ngờ việc sử dụng \r\nnguồn gốc cho máy chữ và các thiết bị tương tự.

Khi bạn muốn có một dòng mới trong khi sử dụng một máy đánh chữ có nhiều dòng, có hai hành động vật lý mà nó phải thực hiện: trượt cỗ xe trở lại từ đầu (bên trái, ở Hoa Kỳ) của trang và đưa giấy lên một bậc .

Quay lại thời của máy in dòng, cách duy nhất để làm văn bản in đậm, chẳng hạn, là quay trở lại vận chuyển mà KHÔNG CÓ dòng mới và in cùng các ký tự trên các ký tự cũ, do đó thêm nhiều mực hơn, do đó làm cho nó trông tối hơn (in đậm) . Khi chức năng "dòng mới" cơ học không thành công trong một máy đánh chữ, đây là kết quả gây khó chịu: bạn có thể nhập vào dòng văn bản trước đó nếu bạn không chú ý.


3
Tiêu chuẩn ASCII cho dòng mới là \ r \ n. (Ngoài một khoảng thời gian ngắn khi Bell Phone có quyền kiểm soát của ủy ban tiêu chuẩn). Đổi lại sự độc quyền điện thoại, Bell Phone đã từ bỏ công việc nhắn tin (telegram, teletype) và không quan tâm đến việc sử dụng tiêu chuẩn hiện có. HTTP, HTML, PCDOS và MSDOS đã sử dụng tiêu chuẩn ASCII. Bell Phone đã chọn không theo tiêu chuẩn cho unix vì họ không có doanh nghiệp hiện tại để tương thích.
David

12

Hai nhân vật khác nhau cho các hệ điều hành khác nhau. Ngoài ra, điều này đóng một vai trò trong dữ liệu truyền qua TCP/IPđòi hỏi phải sử dụng\r\n .

\n Unix

\r Mac

\r\n Windows và DOS.


10
Tôi nghĩ bạn đang nhầm lẫn với các giao thức ứng dụng, TCP / IP không có ý tưởng về \ n và \ r.
jean-loup 23/07/14

4
TCP / IP không yêu cầu sử dụng \ r \ n. Các giao thức khác nhau dựa trên Telnet yêu cầu nó, bao gồm cả SMTP, POP3, FTP, HTTP, ...
Hầu tước Lorne

9

Hoàn thành,

Trong tập lệnh shell (bash), bạn có thể sử dụng \rđể gửi con trỏ, ở phía trước trên dòng và, tất nhiên \nđể đặt con trỏ trên một dòng mới.

Ví dụ: thử:

echo -en "AA--AA" ; echo -en "BB" ; echo -en "\rBB"
  • Màn hình "echo" đầu tiên AA--AA
  • Thư hai : AA--AABB
  • Cuối cùng : BB--AABB

Nhưng đừng quên sử dụng -enlàm tham số.


5

Trong các cửa sổ, \ n di chuyển đến đầu dòng tiếp theo. \ R di chuyển đến đầu dòng hiện tại mà không di chuyển đến dòng tiếp theo. Tôi đã sử dụng \ r trong các ứng dụng bảng điều khiển của riêng mình, nơi tôi đang thử nghiệm một số mã và tôi không muốn thấy văn bản cuộn lên màn hình của mình, thay vì sử dụng \ n sau khi in một số văn bản, ví dụ, tốc độ khung hình ( FPS), tôi sẽ inf ("% - 10d \ r", fps); Điều này sẽ đưa con trỏ trở về đầu dòng mà không chuyển xuống dòng tiếp theo và cho phép tôi có thông tin khác trên màn hình không bị cuộn trong khi tốc độ khung hình liên tục cập nhật trên cùng một dòng (% -10 tạo ra chắc chắn đầu ra ít nhất là 10 ký tự, còn lại hợp lý để nó kết thúc được đệm bởi khoảng trắng, ghi đè bất kỳ giá trị cũ nào cho dòng đó). Nó khá tiện dụng cho những thứ như thế này,

Một ít lịch sử

/ R là viết tắt của "return" hoặc "carcar return", vốn có lịch sử của nó với máy đánh chữ. Một chiếc xe ngựa trở về di chuyển chiếc xe của bạn sang bên phải để bạn gõ vào đầu dòng.

/ N là viết tắt của "dòng mới", một lần nữa, từ những ngày đánh máy bạn chuyển xuống một dòng mới. Tuy nhiên, không phải lúc đầu nó bắt đầu, đó là lý do tại sao một số HĐH chấp nhận sự cần thiết của cả hai trả về theo sau là một dòng mới, vì đó là thứ tự mà một máy đánh chữ đã thực hiện. Nó cũng giải thích các máy tính 8 bit cũ đã sử dụng. để có "Trả lại" thay vì "Nhập", từ "trả lại xe ngựa", điều này đã quen thuộc.


1

Chỉ để thêm vào sự nhầm lẫn, tôi đã làm việc trên một trình soạn thảo văn bản đơn giản bằng cách sử dụng phần tử TextArea trong trang HTML trong trình duyệt. Để dự đoán các tai ương tương thích liên quan đến CR / LF, tôi đã viết mã để kiểm tra nền tảng và sử dụng bất kỳ quy ước dòng mới nào có thể áp dụng cho nền tảng.

Tuy nhiên, tôi đã phát hiện ra một điều thú vị khi kiểm tra các ký tự thực có trong TextArea, thông qua một hàm JavaScript nhỏ tạo dữ liệu hex tương ứng với các ký tự.

Đối với bài kiểm tra, tôi đã gõ vào văn bản sau:

Xin chào, Thế giới [nhập]

Tạm biệt, Thế giới tàn khốc [nhập]

Khi tôi kiểm tra dữ liệu văn bản, chuỗi byte tôi thu được là:

48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 0a 47 6f 6f 64 62 79 65 2c 20 43 72 75 65 6c 20 57 6f 72 6c 64 0a

Bây giờ, hầu hết mọi người nhìn vào điều này và thấy 0a nhưng không có byte 0d, sẽ nghĩ rằng đầu ra này được lấy trên nền tảng Unix / Linux. Nhưng, đây là vấn đề: trình tự này tôi đã nhận được trong Google Chrome trên Windows 7 64 bit.

Vì vậy, nếu bạn đang sử dụng phần tử TextArea và kiểm tra văn bản, KIỂM TRA đầu ra như tôi đã làm ở trên, để đảm bảo byte ký tự thực tế nào được trả về từ TextArea của bạn. Tôi vẫn chưa thấy điều này khác với các nền tảng khác hoặc các trình duyệt khác, nhưng đáng lưu ý nếu bạn đang thực hiện xử lý văn bản qua JavaScript và bạn cần làm cho nền tảng xử lý văn bản đó trở nên độc lập.

Các quy ước được đề cập trong các bài viết trên áp dụng cho đầu ra của bàn điều khiển , nhưng các phần tử HTML, xuất hiện, tuân thủ quy ước UNIX / Linux. Trừ khi có người phát hiện khác trên một nền tảng / trình duyệt khác.


0
#include <stdio.h>

void main()
{
  int countch=0;
  int countwd=1;

  printf("Enter your sentence in lowercase: ");
  char ch='a';
  while(ch!='\r')
  {
    ch=getche();
    if(ch==' ')
      countwd++;
    else
      countch++;
  }

  printf("\n Words = ",countwd);

  printf("Characters = ",countch-1);

  getch();

}

hãy lấy ví dụ này thử đặt \ n thay cho \ r nó sẽ không hoạt động và thử đoán tại sao?


1
Điều này chỉ hoạt động nếu HĐH gạch chân của bạn gửi \ r \ n khi bạn nhấn phím ENTER, như MS DOS, DECS TOPS-10, CP / M, RT-11, v.v. Trong các hệ điều hành: es như Multic, Unix và Unix-like ( Linux, Minix, v.v.) Phím BeOS, RISCOS, vv ENTER chỉ gửi cho bạn một ký tự \ n.
Anders

1
ahh vâng, ngày xưa tốt đẹp khi bàn phím được sử dụng để có cả hai ReturnEnter. Ngay cả bàn phím không dây hiện đại của tôi vẫn hiển thị mũi tên xuống và lùi trên Returnphím cũ (hiện có tiêu đề "Enter" để phù hợp với phím của bàn phím số Enter, không hiển thị mũi tên)
cần thiết vào

0

Sự khác biệt giữa \ n (dòng mới) và \ r (trả lại xe) là gì?

Cụ thể, có sự khác biệt thực tế nào giữa \n\rkhông? Có nơi nào nên dùng cái này thay cho cái kia không?


Tôi muốn thực hiện một thử nghiệm ngắn với các chuỗi thoát tương ứng của \ndòng mới và \rcho việc vận chuyển trở lại để minh họa cho sự khác biệt rõ rệt giữa chúng.

Tôi biết rằng câu hỏi này được hỏi là độc lập với ngôn ngữ. Tuy nhiên, chúng tôi cần một ngôn ngữ ít nhất để hoàn thành thử nghiệm. Trong trường hợp của tôi, tôi đã chọn C ++, nhưng thử nghiệm thường được áp dụng trong bất kỳ ngôn ngữ lập trình nào.

Chương trình chỉ đơn giản là lặp đi lặp lại để in một câu vào bàn điều khiển, được thực hiện bởi một vòng lặp for-loop.


Chương trình mới

#include <iostream>

int main(void)
{
    for(int i = 0; i < 7; i++)
    {
       std::cout << i + 1  <<".Walkthrough of the for-loop \n";   // Notice `\n` at the end.
    }
    return 0;
}

Đầu ra:

1.Walkthrough of the for-loop
2.Walkthrough of the for-loop
3.Walkthrough of the for-loop
4.Walkthrough of the for-loop
5.Walkthrough of the for-loop
6.Walkthrough of the for-loop
7.Walkthrough of the for-loop

Lưu ý rằng kết quả này sẽ không được cung cấp trên bất kỳ hệ thống nào , bạn đang thực thi mã C ++ này. Nhưng nó sẽ làm việc cho các hệ thống hiện đại nhất. Đọc dưới đây để biết thêm chi tiết.


Bây giờ, cùng một chương trình, nhưng với sự khác biệt, \nđược thay thế bằng \rở cuối chuỗi in.

Chương trình vận chuyển trở lại:

#include <iostream>

int main(void)
{
    for(int i = 0; i < 7; i++)
    {
       std::cout << i + 1  <<".Walkthrough of the for-loop \r";   // Notice `\r` at the end.
    }
    return 0;
}

Đầu ra:

7.Walkthrough of the for-loop 

Nhận thấy sự khác biệt ở đâu? Sự khác biệt chỉ đơn giản là, khi bạn sử dụng trình tự thoát trở lại Vận chuyển \rở cuối mỗi chuỗi in, lần lặp tiếp theo của chuỗi này không đi vào dòng văn bản sau - Ở cuối mỗi chuỗi in, con trỏ không nhảy đến * đầu dòng tiếp theo.

Thay vào đó, con trỏ nhảy trở lại đầu dòng, trên đó anh ta đã ở cuối, trước khi sử dụng \rký tự. - Kết quả là mỗi lần lặp tiếp theo của chuỗi in sẽ thay thế lần trước.

* Lưu ý: \nKhông nhất thiết phải nhảy đến đầu dòng văn bản sau. Trên một số, nói chung, nhiều hệ thống hoạt động hơn, kết quả của \nký tự dòng mới có thể là, nó nhảy đến bất cứ nơi nào trong dòng sau, không chỉ ở đầu. Đó là lý do tại sao, họ yêu cầu sử dụng \r \nđể có được ở đầu dòng văn bản tiếp theo.


Thí nghiệm này cho chúng tôi thấy sự khác biệt giữa dòng mới và lợi nhuận vận chuyển trong bối cảnh đầu ra của việc lặp lại trình tự in.

Khi thảo luận về đầu vào trong một chương trình, một số thiết bị đầu cuối / bảng điều khiển có thể chuyển đổi hoàn trả vận chuyển thành một dòng mới để có tính di động, tính tương thích và tính toàn vẹn tốt hơn.

Nhưng nếu bạn có quyền lựa chọn cái này cho cái khác hoặc muốn hoặc chỉ cần sử dụng rõ ràng một cái cụ thể, bạn nên luôn luôn hoạt động với cái đó, phù hợp với mục đích của nó và phân biệt chặt chẽ giữa.

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.