Tại sao Windows sử dụng CR LF?


85

Tôi hiểu sự khác biệt giữa cả hai nên không cần phải đi sâu vào điều đó, nhưng tôi chỉ tự hỏi lý do đằng sau lý do tại sao Windows sử dụng cả CR và LF để chỉ ra ngắt dòng. Có vẻ như phương pháp Linux (chỉ sử dụng LF) có ý nghĩa hơn nhiều, tiết kiệm dung lượng và dễ phân tích cú pháp hơn.




Đây là wikipedia về lịch sử của dòng mới: en.wikipedia.org/wiki/Newline#History
Szocske

Có thể cần lưu ý rằng CRLF trên Windows hầu hết chỉ là một quy ước / mặc định. Hầu hết các chương trình đều hỗ trợ (mặc dù bạn có thể phải làm khó các cài đặt). Cá nhân tôi hầu như không bao giờ sử dụng CRLF, thay vào đó chọn LF kiểu UNIX; chỉ một số ít chương trình vẫn gặp sự cố với các tệp chỉ sử dụng LF.
Kevin

CR + LF là cách chính xác để làm điều đó (nó là tiêu chuẩn ), vì vậy câu hỏi không phải là tại sao Windows làm đúng mà tại sao Mac và Unix / Linux lại làm sai. Di sản của LF độc lập là sự lười biếng và đi đường tắt. Tôi luôn CR + LF, ngoại trừ một số thứ Linux nhất định nhìn chằm chằm vào CR + LF, vì vậy tôi chuyển sang chế độ LF cho điều đó. IMO, việc hiểu sai CR + LF còn tệ hơn nhiều so với việc hiểu sai một LF độc lập.
InterLinked

Câu trả lời:


96

Lịch sử khi sử dụng máy in kim teletypes CR sẽ trả về dòng xuống vị trí đầu tiên của dòng trong khi LF sẽ chuyển tới dòng tiếp theo. Bản thân việc sử dụng CR + LF trong tệp đã giúp bạn có thể gửi tệp trực tiếp đến máy in mà không cần bất kỳ loại trình điều khiển máy in nào.

Cảm ơn @zaph đã chỉ ra rằng đó là máy viễn thông chứ không phải máy in kim


46
Sự khó chịu rất phổ biến vì một lợi ích rất nhỏ.
Dávid Horváth

7
@Anders Trên thực tế, đó là lý do tại sao teletypes, CR trả đầu in về bên trái và LF nâng cao giấy. Teletypes trước máy in kim.
zaph

5
@zaph Đây là lý do tại sao tôi yêu thích Stack Overflow. 2 năm sau và tôi nhận được sự sửa chữa và học được một số điều mới.
Anders Abel,

30

@sshannin đã đăng một URL từ blog của Raymond Chen, nhưng nó không hoạt động nữa. Blog đã thay đổi phần mềm nội bộ của nó, vì vậy các URL đã thay đổi.

Sau khi xem qua các bài viết cũ trong blog mới, tôi đã tìm thấy nó ở đây .

Trích dẫn từ blog:

Tại sao đầu cuối dòng CR + LF?

Giao thức này có từ thời của những người viết bài từ xa. CR là viết tắt của “xuống dòng” - ký tự điều khiển CR trả lại đầu in (“xuống dòng”) về cột 0 mà không cần chuyển giấy. LF là viết tắt của “linefeed” - ký tự điều khiển LF nâng giấy lên một dòng mà không cần di chuyển đầu in. Vì vậy, nếu bạn muốn trả đầu in về cột 0 (sẵn sàng để in dòng tiếp theo) và tiến giấy (để nó in trên giấy mới), bạn cần cả CR và LF.

Nếu bạn truy cập các tài liệu giao thức internet khác nhau, chẳng hạn như RFC 0821 (SMTP), RFC 1939 (POP), RFC 2060 (IMAP) hoặc RFC 2616 (HTTP), bạn sẽ thấy rằng tất cả chúng đều chỉ định CR + LF là trình tự kết thúc dòng. Vì vậy, câu hỏi thực sự không phải là "Tại sao CP / M, MS-DOS và Win32 sử dụng CR + LF làm dấu chấm dứt dòng?" mà đúng hơn là "Tại sao những người khác lại chọn khác với các tài liệu tiêu chuẩn này và sử dụng một số đầu cuối đường dây khác?"

Unix đã sử dụng LF thuần túy làm trình tự kết thúc dòng. Nếu bạn nhìn vào các tùy chọn stty, bạn sẽ thấy rằng tùy chọn onlcr chỉ định liệu một LF có nên được thay đổi thành CR + LF hay không. Nếu bạn cài đặt sai cài đặt này, bạn sẽ nhận được văn bản bậc thang, trong đó

each
    line
        begins 

nơi dòng trước đó đã dừng lại. Vì vậy, ngay cả unix, khi để ở chế độ thô, yêu cầu CR + LF để kết thúc các dòng. CR ngầm trước LF là một phát minh unix, có thể là một nền kinh tế, vì nó tiết kiệm một byte trên mỗi dòng.

Tổ tiên unix của ngôn ngữ C đã đưa quy ước này vào tiêu chuẩn ngôn ngữ C, chỉ yêu cầu “\ n” (mã hóa LF) để kết thúc các dòng, tạo gánh nặng cho các thư viện thời gian chạy để chuyển đổi dữ liệu tệp thô thành các dòng logic.

Ngôn ngữ C cũng đưa ra thuật ngữ “dòng mới” để thể hiện khái niệm “dấu chấm cuối dòng chung”. Tôi được biết rằng ủy ban ASCII đã đổi tên ký tự 0x0A thành “dòng mới” vào khoảng năm 1996, vì vậy mức độ nhầm lẫn đã được nâng cao hơn nữa.

Đây là một cuộc thảo luận khác về chủ đề này, từ góc độ unix

Tôi đã thay đổi liên kết thứ hai này thành ảnh chụp nhanh trong The Wayback Machine, vì trang thực tế không còn nữa.

Tôi mong bạn trả lời câu hỏi này.


Vì bạn không thực sự trả lời câu hỏi, chỉ cần sửa một liên kết đã trở nên cũ, trong một nhận xét , đây thực sự phải là một nhận xét. Dù sao, cảm ơn vì liên kết chính xác. Vui lòng thêm nó như một bình luận, câu trả lời này có thể bị xóa.
Tom Brunberg

1
OK, tôi đã thêm vào đây văn bản từ blog, vì vậy nếu liên kết bị hỏng một lần nữa, văn bản vẫn có sẵn ở đây. Tôi nghĩ rằng điều này nên được giữ như một câu trả lời, không chỉ là một bình luận, vì thông tin này thực sự trả lời câu hỏi được hỏi ban đầu.
OMA

7
Tôi thực sự ghét cái cách mà Microsoft làm mất dần các liên kết của họ một cách thường xuyên.
Mark Ransom

1
Câu trả lời này chi tiết hơn câu trả lời bị loại trừ và trả lời không chỉ câu hỏi được hỏi mà còn đoán được lý do cho câu hỏi, IMHO thì tốt hơn.
Alexei Martianov

18

Nó đến từ những chiếc máy đánh chữ (và máy đánh chữ) từ những ngày xa xưa.

Trước đây, khi bạn nhập xong một dòng, bạn phải di chuyển hộp đựng của máy đánh chữ (giữ tờ giấy và trượt sang trái khi bạn nhập) trở lại đầu dòng (CR). Sau đó, bạn phải tiến tờ giấy xuống một dòng (LF) để chuyển sang dòng tiếp theo.

Có những trường hợp bạn có thể không muốn dòng khi trả về dòng xuống dòng, chẳng hạn như nếu bạn định gạch ngang một ký tự bằng dấu gạch ngang (bạn chỉ cần ghi đè nó).

Nhưng về cơ bản, nó tổng hợp thành quy ước. DOS đã sử dụng quy ước CR / LF đầy đủ và UNIX đã rút ngắn nó một chút. Bây giờ chúng tôi bị mắc kẹt!


2

Những người khác đã đưa ra câu trả lời, nhưng tôi muốn nói thêm ... Tôi đoán bạn còn quá nhỏ để sử dụng máy đánh chữ? ;) Cỗ xe là một cái trống. Di chuyển nó theo chiều ngang sang phải, đưa đầu loại tĩnh trở lại lề trái của trang. Xoay dòng chữ bằng ngón tay và ngón cái của bạn sẽ nâng trang lên một (các) dòng.


2
Máy đánh chữ? Tôi nghĩ rằng tôi thấy một trong những người trong một bảo tàng lần :)
Kyle

@ Kyle tôi phải cười và điều này sáng lên ngày của tôi :)
likejudo

1

Từ Wikipedia :

Trình tự CR + LF được sử dụng phổ biến trên nhiều hệ thống máy tính ban đầu sử dụng máy teletype, điển hình là ASR33, làm thiết bị điều khiển, vì trình tự này được yêu cầu để đặt các máy in đó ở đầu dòng mới.


1

Tôi đã thấy nhiều tài khoản cho rằng lý do để gửi hai ký tự (và đôi khi nhiều hơn) thay vì một ký tự là để khớp tốc độ truyền dữ liệu tốt hơn với tốc độ in vật lý (cách đây đã lâu ). Việc di chuyển đầu in mất nhiều thời gian hơn so với việc in một ký tự đơn lẻ và gửi thêm ký tự là một cách ngăn việc truyền dữ liệu đi trước thiết bị in. Vì vậy, lý do chúng ta có nhiều ký tự cho cuối dòng trong Windows về cơ bản giống với lý do chúng ta có bàn phím QWERTY - nó nhằm mục đích làm chậm mọi thứ .

Rõ ràng lý do mà thực tiễn này vẫn tiếp tục trong Windows cho đến ngày nay là dựa trên một số khái niệm về khả năng tương thích ngược liên tục, và cuối cùng, chỉ là quán tính đơn giản.

Tuy nhiên, lưu ý rằng quy ước này không được Windows thực thi nghiêm ngặt ở cấp hệ điều hành . Bất kỳ ứng dụng Windows nào cũng có thể miễn phí bỏ qua quy ước, tùy thuộc vào những ứng dụng khác mà nó đang cố gắng tương thích.

Điều thú vị là bài báo trên Wikipedia về "Newline" , tuyên bố rằng Windows 8 có thể giới thiệu một sự thay đổi để chỉ sử dụng LF. Bài báo cũng nói rằng Mac OS X đã giới thiệu một quá trình chuyển đổi từ LF + CR sang chỉ LF.


4
"Dự định làm mọi thứ chậm lại" - cần trích dẫn.
Elliot Gorokhovsky

4
Trên thực tế, toàn bộ đoạn đầu tiên - cần trích dẫn.
Elliot Gorokhovsky

2
Đây là một bài viết có liên quan chặt chẽ của Jeff Atwood tham khảo cùng một nội dung Wikipedia: The Great Newline Schism . Có rất nhiều nhận xét của người dùng thông minh ở đó - bao gồm một số chứng minh quan điểm của tôi rằng đây không phải là mối quan tâm ở cấp hệ điều hành và rằng phần lớn các ứng dụng Windows sẽ hoạt động tốt với các tệp văn bản chỉ có LF. Ngoài ra còn có bình luận vui: "Windows 10 sử dụng CR / LF để duy trì khả năng tương thích với máy teletype Model 33 năm 1963 ".
Brent Bradburn

1
@ RenéG Tôi không cần trích dẫn, tôi đã ở đó và tận mắt chứng kiến. Một số máy in kim đời đầu yêu cầu thêm một số NULs bổ sung cho phép đo tốt, vì tốc độ truyền của giao diện tăng lên, đầu không thể theo kịp ngay cả với hai ký tự đáng giá. Vấn đề đó đã biến mất khi bộ đệm và kiểm soát luồng đã đi vào hình ảnh, nhưng các máy in đầu tiên không có điều đó. Cuối cùng, khi máy in trở thành chỉ xuất, chúng chuyển sang một giao diện song song có tính năng bắt tay tích hợp.
Mark Ransom

1
“Trái với suy nghĩ thông thường, bố cục QWERTY không được thiết kế để làm chậm người đánh máy,…” - Thuộc tính | QWERTY - Wikipedia
Jason Sparc
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.