เหตุใด Windows จึงใช้ CR LF


87

ฉันเข้าใจความแตกต่างระหว่างทั้งสองจึงไม่จำเป็นต้องเข้าไปในนั้น แต่ฉันแค่สงสัยว่าเหตุผลเบื้องหลังทำไม Windows ใช้ทั้ง CR และ LF เพื่อระบุการแบ่งบรรทัด ดูเหมือนว่าวิธีการของ Linux (เพียงแค่ใช้ LF) จะสมเหตุสมผลกว่ามากประหยัดพื้นที่และแยกวิเคราะห์ได้ง่ายกว่า



1
จากบล็อกของ Raymond Chen: blogs.msdn.com/b/oldnewthing/archive/2004/03/18/91899.aspx
sshannin

นี่คือวิกิพีเดียเกี่ยวกับประวัติของ newline: en.wikipedia.org/wiki/Newline#History
Szocske

อาจเป็นที่น่าสังเกตว่า CRLF บน Windows ส่วนใหญ่เป็นเพียงแบบแผน / ค่าเริ่มต้น โปรแกรมส่วนใหญ่รองรับอย่างใดอย่างหนึ่ง (แม้ว่าคุณอาจต้องยุ่งกับการตั้งค่าก็ตาม) โดยส่วนตัวแล้วฉันแทบไม่เคยใช้ CRLF เลยโดยเลือกใช้ LF สไตล์ UNIX แทน มีโปรแกรมเพียงไม่กี่โปรแกรมที่ยังมีปัญหากับไฟล์ที่เพิ่งใช้ LF
Kevin

CR + LF เป็นวิธีที่ถูกต้องในการทำ (เป็นมาตรฐาน ) ดังนั้นคำถามจึงไม่ใช่สาเหตุที่ Windows ทำอย่างถูกต้อง แต่ทำไม Mac และ Unix / Linux ถึงทำไม่ถูกต้อง มรดกของ LF แบบสแตนด์อโลนคือความเกียจคร้านและการใช้ทางลัด ฉันมักจะ CR + LF ยกเว้นลินุกซ์บางอย่างที่จ้องมอง CR + LF ดังนั้นฉันจึงเปลี่ยนเป็นโหมด LF สำหรับสิ่งนั้น IMO การตีความ CR + LF ผิดนั้นแย่กว่าการตีความ LF แบบสแตนด์อโลนอย่างผิด ๆ
InterLinked

คำตอบ:


97

ในอดีตเมื่อใช้ เครื่องพิมพ์ดอทเมทริกซ์ teletypes CR จะส่งแคร่กลับไปที่ตำแหน่งแรกของบรรทัดในขณะที่ LF จะป้อนไปยังบรรทัดถัดไป การใช้ CR + LF ในไฟล์ทำให้สามารถส่งไฟล์ไปยังเครื่องพิมพ์ได้โดยตรงโดยไม่ต้องใช้ไดรเวอร์เครื่องพิมพ์ใด ๆ

ขอบคุณ @zaph ที่ชี้ให้เห็นว่ามันเป็นเทเลไทป์ไม่ใช่เครื่องพิมพ์ดอทเมทริกซ์


47
การแกล้งกันมากเพื่อประโยชน์น้อยมาก
DávidHorváth

7
@ และอันที่จริงมันเป็นเทเลไทป์นั่นคือเหตุผล CR กลับหัวพิมพ์ไปทางซ้ายและ LF ก็เลื่อนกระดาษ Teletypes เครื่องพิมพ์ดอทเมทริกซ์ที่นำหน้า
zaph

5
@zaph นี่คือเหตุผลที่ฉันชอบ Stack Overflow 2 ปีต่อมาฉันได้รับการแก้ไขและเรียนรู้สิ่งใหม่ ๆ
Anders Abel

เนื่องจาก Windows ติดตาม Unix มาหลายปีจึงทำให้งงว่าพวกเขาไม่ได้ทำตาม Unix model ของ LF
belanger

32

@sshannin โพสต์ URL จากบล็อกของ Raymond Chen แต่ใช้ไม่ได้อีกต่อไป บล็อกได้เปลี่ยนซอฟต์แวร์ภายในดังนั้น URL จึงเปลี่ยนไป

หลังจากรวบรวมข้อมูลผ่านกระทู้เก่าในบล็อกใหม่ของฉันได้พบมันนี่

อ้างจากบล็อก:

ทำไม Line Terminator CR + LF?

โปรโตคอลนี้ย้อนกลับไปในสมัยของผู้ผลิตเครื่องพิมพ์ดีดโทรเลข CR ย่อมาจาก“ carriage return” - อักขระควบคุม CR จะส่งคืนหัวพิมพ์ (“ carriage”) ไปที่คอลัมน์ 0 โดยไม่เลื่อนกระดาษไปข้างหน้า LF ย่อมาจาก "linefeed" - อักขระควบคุม LF ทำให้กระดาษสูงขึ้นหนึ่งบรรทัดโดยไม่ต้องขยับหัวพิมพ์ ดังนั้นหากคุณต้องการกลับหัวพิมพ์ไปที่คอลัมน์ศูนย์ (พร้อมที่จะพิมพ์บรรทัดถัดไป) และเลื่อนกระดาษ (เพื่อให้พิมพ์บนกระดาษใหม่) คุณต้องมีทั้ง CR และ LF

หากคุณไปที่เอกสารอินเทอร์เน็ตโปรโตคอลต่างๆเช่น RFC 0821 (SMTP), RFC 1939 (POP), RFC 2060 (IMAP) หรือ RFC 2616 (HTTP) คุณจะเห็นว่าเอกสารทั้งหมดระบุ CR + LF เป็น ลำดับการสิ้นสุดบรรทัด ดังนั้นคำถามที่แท้จริงไม่ใช่ "ทำไม CP / M, MS-DOS และ Win32 จึงใช้ CR + LF เป็นตัวยุติบรรทัด" แต่เป็น "เหตุใดคนอื่นจึงเลือกที่จะแตกต่างจากเอกสารมาตรฐานเหล่านี้และใช้ตัวบอกเลิกบรรทัดอื่น ๆ "

Unix ใช้ LF ธรรมดาเป็นลำดับการสิ้นสุดบรรทัด หากคุณดูตัวเลือก stty คุณจะเห็นว่าตัวเลือก onlcr ระบุว่าควรเปลี่ยน LF เป็น CR + LF หรือไม่ หากคุณตั้งค่านี้ผิดคุณจะได้รับข้อความขั้นแรกโดยที่

each
    line
        begins 

โดยที่บรรทัดก่อนหน้าทิ้งไว้ ดังนั้นแม้แต่ unix เมื่ออยู่ในโหมดดิบก็ต้องใช้ CR + LF เพื่อยุติบรรทัด CR โดยนัยก่อน LF เป็นสิ่งประดิษฐ์ที่ไม่เหมือนใครซึ่งอาจเป็นเศรษฐกิจเนื่องจากประหยัดหนึ่งไบต์ต่อบรรทัด

วงศ์ตระกูลยูนิกซ์ของภาษาซีดำเนินการตามแบบแผนนี้ในมาตรฐานภาษาซีซึ่งต้องการเพียง“ \ n” (ซึ่งเข้ารหัส LF) ในการยุติบรรทัดโดยวางภาระให้กับไลบรารีรันไทม์เพื่อแปลงข้อมูลไฟล์ดิบเป็นเส้นตรรกะ

ภาษาซียังแนะนำคำว่า "newline" เพื่อแสดงแนวคิดของ "generic line terminator" ฉันได้รับแจ้งว่าคณะกรรมการ ASCII ได้เปลี่ยนชื่อตัวละคร 0x0A เป็น "newline" ในราวปี 1996 ดังนั้นระดับความสับสนจึงเพิ่มสูงขึ้น

นี่คือการอภิปรายอีกครั้งของหัวข้อจากมุมมองของยูนิกซ์

ฉันได้เปลี่ยนลิงค์ที่สองนี้เป็นสแนปชอตใน The Wayback Machine เนื่องจากหน้าจริงไม่สามารถใช้งานได้อีกต่อไป

ฉันหวังว่านี้ตอบคำถามของคุณ.


เนื่องจากคุณไม่ได้ตอบคำถามจริงๆเพียงแค่แก้ไขลิงก์ที่ค้างในความคิดเห็นนี่ควรเป็นความคิดเห็นจริงๆ ยังไงก็ขอบคุณสำหรับลิงค์ที่ถูกต้อง โปรดเพิ่มเป็นความคิดเห็นคำตอบนี้อาจถูกลบ
Tom Brunberg

1
ตกลงฉันได้เพิ่มข้อความจากบล็อกที่นี่แล้วดังนั้นหากลิงก์ไม่ดีอีกข้อความก็ยังอยู่ที่นี่ ฉันคิดว่าควรเก็บไว้เป็นคำตอบไม่ใช่แค่ความคิดเห็นเนื่องจากข้อมูลนี้ตอบคำถามที่ถามในตอนแรก
OMA

9
ฉันจริงๆเกลียดวิธีที่ไมโครซอฟท์ obsoletes การเชื่อมโยงของพวกเขาเป็นประจำ
Mark Ransom

2
คำตอบนี้มีรายละเอียดมากกว่าข้อยกเว้นและไม่เพียง แต่ตอบคำถามที่ถาม แต่เหตุผลที่เดาได้สำหรับคำถาม IMHO จะดีกว่า
Alexei Martianov

18

มันมาจากเครื่องโทรพิมพ์ (และเครื่องพิมพ์ดีด) ตั้งแต่สมัยก่อน

เคยเป็นเช่นนั้นเมื่อคุณพิมพ์บรรทัดเสร็จแล้วคุณต้องเลื่อนแคร่ของเครื่องพิมพ์ดีด (ซึ่งถือกระดาษและเลื่อนไปทางซ้ายขณะที่คุณพิมพ์) กลับไปที่จุดเริ่มต้นของบรรทัด (CR) จากนั้นคุณต้องเลื่อนกระดาษไปตามบรรทัด (LF) เพื่อเลื่อนไปยังบรรทัดถัดไป

มีหลายกรณีที่คุณอาจไม่ต้องการป้อนบรรทัดเมื่อคืนแคร่เช่นถ้าคุณจะขีดทับอักขระที่มีเส้นประ (คุณแค่เขียนทับ)

แต่โดยพื้นฐานแล้วมันจะเดือดพล่านไปตามแบบแผน DOS ใช้รูปแบบ CR / LF เต็มรูปแบบและ UNIX ทำให้สั้นลงเล็กน้อย ตอนนี้เราติดอยู่!


2

คนอื่นให้คำตอบ แต่ฉันอยากเพิ่ม ... ฉันเดาว่าคุณยังเด็กเกินไปที่จะใช้เครื่องพิมพ์ดีด? ;) แคร่เป็นกลอง เลื่อนไปทางขวาในแนวนอนนำส่วนหัวของเครื่องเขียนกลับมาที่ขอบด้านซ้ายของหน้า การหมุนแคร่ตลับหมึกโดยใช้นิ้วและนิ้วหัวแม่มือจะเลื่อนหน้าไปทีละบรรทัด


2
เครื่องพิมพ์ดีด? ฉันคิดว่าฉันเคยเห็นหนึ่งในนั้นในพิพิธภัณฑ์ครั้งหนึ่ง :)
Kyle

@Kyle ฉันต้องหัวเราะและทำให้วันของฉันสดใสขึ้น :)
likejudo

1

จากWikipedia :

ลำดับ CR + LF มีการใช้งานทั่วไปในระบบคอมพิวเตอร์ยุคแรก ๆ ที่ใช้เครื่องโทรพิมพ์โดยทั่วไปคือ ASR33 เป็นอุปกรณ์คอนโซลเนื่องจากลำดับนี้จำเป็นต้องวางตำแหน่งเครื่องพิมพ์เหล่านั้นที่จุดเริ่มต้นของบรรทัดใหม่


1

ฉันได้เห็นมากกว่าหนึ่งบัญชีถึงผลว่าเหตุผลที่ต้องส่งอักขระสองตัว (และบางครั้งก็มากกว่านั้น) แทนที่จะเป็นบัญชีเดียวเพื่อให้สามารถจับคู่อัตราการถ่ายโอนข้อมูลกับอัตราการพิมพ์จริงได้ดีขึ้น ( นี่เป็นเวลานานแล้ว ) การย้ายหัวพิมพ์ใช้เวลานานกว่าการพิมพ์อักขระเดี่ยวและการส่งอักขระพิเศษเป็นวิธีหนึ่งในการป้องกันไม่ให้การถ่ายโอนข้อมูลไปข้างหน้าอุปกรณ์การพิมพ์ ดังนั้นเหตุผลที่เรามีตัวละครหลายสำหรับการสิ้นสุดของบรรทัดใน Windows เป็นพื้นเดียวกับเหตุผลที่เรามีคีย์บอร์ด QWERTY - ก็ตั้งใจกับสิ่งที่ช้าลง

เห็นได้ชัดว่าเหตุผลที่การปฏิบัตินี้ยังคงดำเนินต่อไปใน Windows จนถึงทุกวันนี้นั้นมาจากแนวคิดบางประการเกี่ยวกับความเข้ากันได้แบบย้อนกลับอย่างต่อเนื่องและในที่สุดความเฉื่อยธรรมดา ๆ

ของโน้ต แต่การประชุมนี้ไม่ได้บังคับใช้อย่างเคร่งครัดโดย Windows ที่ระดับระบบปฏิบัติการ แอปพลิเคชัน Windows ใด ๆ มีอิสระที่จะเพิกเฉยต่อหลักการดังกล่าวทั้งนี้ขึ้นอยู่กับว่าแอปพลิเคชันอื่นใดที่พยายามเข้ากันได้

ที่น่าสนใจคือบทความ Wikipedia เกี่ยวกับ "Newline"อ้างว่า Windows 8 อาจแนะนำการเปลี่ยนแปลงโดยใช้ LF เพียงอย่างเดียว บทความนี้ยังระบุด้วยว่า Mac OS X ได้แนะนำการเปลี่ยนจาก LF + CR เป็น LF


4
"ตั้งใจทำให้สิ่งต่างๆช้าลง" - จำเป็นต้องอ้างอิง
Elliot Gorokhovsky

4
จริงๆแล้วย่อหน้าแรกทั้งหมด - จำเป็นต้องมีการอ้างอิง
Elliot Gorokhovsky

2
นี่คือที่เกี่ยวข้องอย่างใกล้ชิดบทความ Jeff Atwood ที่อ้างอิงเนื้อหาวิกิพีเดียเดียวกัน: The Great นิวไลน์แตกแยก มีความคิดเห็นของผู้ใช้ที่ชาญฉลาดมากมายเช่นกัน - รวมถึงการยืนยันบางประเด็นของฉันว่านี่ไม่ใช่ข้อกังวลระดับระบบปฏิบัติการและแอพ Windows ส่วนใหญ่จะทำงานได้ดีกับไฟล์ข้อความ LF เท่านั้น นอกจากนี้ยังมีข้อคิดเห็นที่น่าสนุก: "Windows 10 ใช้ CR / LF เพื่อรักษาความเข้ากันได้กับเครื่องโทรพิมพ์รุ่นปี 1963 Model 33 "
Brent Bradburn

1
@ RenéGฉันไม่ต้องการการอ้างอิงฉันอยู่ที่นั่นและเห็นมันด้วยตัวเอง เครื่องพิมพ์ดอทเมทริกซ์รุ่นแรก ๆ บางรุ่นต้องการ NUL เพิ่มเติมเพียงไม่กี่ตัวเพื่อการวัดที่ดีเนื่องจากอัตราการส่งข้อมูลของอินเทอร์เฟซเพิ่มขึ้นทำให้ส่วนหัวไม่สามารถติดตามได้แม้จะมีอักขระสองตัว ปัญหานั้นหายไปเมื่อการบัฟเฟอร์และโฟลว์คอนโทรลเข้าสู่รูปภาพ แต่เครื่องพิมพ์รุ่นแรก ๆ ไม่มีสิ่งนั้น ในที่สุดเมื่อเครื่องพิมพ์กลายเป็นเอาต์พุตเท่านั้นพวกเขาจึงไปที่อินเทอร์เฟซแบบขนานที่มีการจับมือกันในตัว
Mark Ransom

1
“ขัดกับความเชื่อที่นิยมรูปแบบ QWERTY ก็ไม่ได้ออกแบบให้ชะลอตัวลงพิมพ์ดีดที่ ...” - อสังหาริมทรัพย์ | QWERTY - Wikipedia
Jason Sparc
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.