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
và \r
không? Có nơi nào nên dùng cái này thay cho cái kia không?
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
và \r
không? Có nơi nào nên dùng cái này thay cho cái kia không?
Câu trả lời:
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:
\n
là mã cho dòng cuối, \r
có nghĩa là không có gì đặc biệt\n
là 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)\r
là mã cho dòng cuối thay thế\r\n
, theo thứ tự này\r\n
là chấm dứt dòng tiêu chuẩn cho các định dạng văn bản trên Internet\r
ra 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), \n
ra 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 .\r
và \n
đóng vai trò tương tự (trừ cả về con trỏ, như có là 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 \r
là 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 ;-).
\0
) được thêm vào sau khi \n
cho 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.
\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 \n
hay \r
có thể nhìn thấy theo nghĩa là ví dụ a
, .
, (
, vv nhân vật.
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.
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
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.
\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), \n
hiện đã được 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 \r
kết thúc -line.
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\n
nguồ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ú ý.
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.
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"
AA--AA
AA--AABB
BB--AABB
Nhưng đừng quên sử dụng -en
làm tham số.
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.
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.
#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?
Return
và Enter
. 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 Return
phí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)
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
và\r
khô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 \n
dòng mới và \r
cho 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 \r
ký 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 ý: \n
Khô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 \n
ký 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.