ความแตกต่างระหว่างชนิดการแยกบรรทัด CR LF, LF และ CR หรือไม่


758

ฉันต้องการทราบความแตกต่าง (พร้อมตัวอย่างถ้าเป็นไปได้) ระหว่างประเภทการแบ่งบรรทัด CR LF (Windows), LF (Unix) และ CR (Macintosh)


9
คล้ายกันมาก แต่ไม่ซ้ำกัน แน่นอน \nโดยทั่วไปจะแสดงโดย linefeed แต่ก็ไม่จำเป็นต้องเป็น linefeed
Adrian McCarthy

92
CR และ LF เป็นอักขระควบคุม ASCII และ Unicode ในขณะที่\rและ\nเป็น abstractions ที่ใช้ในภาษาการเขียนโปรแกรมบางอย่าง การปิดคำถามนี้จะคัดสรรความแตกต่างพื้นฐานระหว่างคำถามและยืดอายุข้อมูลที่ผิด
Adrian McCarthy

5
@AdrianMcCarthy มันเป็นปัญหากับวิธีการโหวตอย่างใกล้ชิดทำหน้าที่เป็นคำตอบในทาง; คำตอบที่อ้างว่าทั้งสองเหมือนกันสามารถ downvoted แล้ว greyed ออกเป็นอย่างมากผิดมาก แต่ใช้เวลา 4 คะแนนเห็นด้วยเท่านั้น มันเกิดขึ้น
Jon Hanna

การกำหนดคำถามนี้เป็นที่ยอมรับได้ดีกว่า แต่ก็ยังคงเป็นคำถามเดียวกัน
Jukka K. Korpela

6
@ JukkaK.Korpela: ไม่มันไม่ใช่อย่างนั้นจริงๆ \nไม่ได้หมายถึงสิ่งเดียวกันในทุกภาษาโปรแกรม
Adrian McCarthy

คำตอบ:


348

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

ข้อมูลทางเช่นเคยในวิกิพีเดีย


52
ฉันคิดว่ามันยังมีประโยชน์ที่จะพูดถึงว่าCRเป็นตัวละครที่หลบหนี\rและเป็นตัวหนีLF \nนอกจากนี้วิกิพีเดีย: นิวไลน์
Robert Vunabandi

1
ในคำง่ายๆCR and LFเป็นเพียงจุดสิ้นสุดของบรรทัดและบรรทัดใหม่ตามลิงค์นี้ถูกต้องหรือไม่
shaijut

@shaijut CR ย่อมาจาก Carriage Return นั่นคือสิ่งที่ส่งคืนรถด้วยเครื่องพิมพ์ดีด ดังนั้นส่วนใหญ่ถูกต้อง
AliFurkan

763

CR และ LF เป็นอักขระควบคุมตามลำดับรหัส0x0D(13 ฐานสิบ) และ0x0A(10 ฐานสิบ)

พวกเขาจะใช้ในการทำเครื่องหมายตัวแบ่งบรรทัดในไฟล์ข้อความ ตามที่คุณระบุ Windows ใช้อักขระสองตัวในลำดับ CR LF Unix ใช้เฉพาะ LF และ MacOS เก่า (pre-OSX MacIntosh) ที่ใช้ CR

มุมมองทางประวัติศาสตร์ที่ไม่มีหลักฐาน:

ตามที่ระบุโดย Peter , CR = Carriage Returnและ LF = Feed Lineนิพจน์สองรายการมีรากอยู่ในเครื่องพิมพ์ดีดเก่า / TTY LF เลื่อนกระดาษขึ้น (แต่รักษาตำแหน่งแนวนอนเหมือนเดิม) และ CR นำ "carriage" กลับมาเพื่อให้ตัวอักษรถัดไปที่พิมพ์จะอยู่ที่ตำแหน่งซ้ายสุดบนกระดาษ (แต่อยู่ในบรรทัดเดียวกัน) CR + LF กำลังทำทั้งสองอย่างเช่นเตรียมพิมพ์บรรทัดใหม่ เมื่อเวลาผ่านไปความหมายทางกายภาพของรหัสไม่สามารถใช้งานได้และเมื่อหน่วยความจำและพื้นที่ว่างบนฟลอปปี้ดิสก์มีค่าสูงนักออกแบบระบบปฏิบัติการบางคนตัดสินใจที่จะใช้ตัวอักษรตัวใดตัวหนึ่งเท่านั้น -)

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


11
ดังนั้นจริง ๆ แล้ว Windows เป็นระบบปฏิบัติการเดียวที่ใช้อักขระเหล่านี้อย่างถูกต้อง, Carriage Return, ตามด้วย Line Feed
Rolf

4
ถ้าอย่างนั้นจะบอกว่าไฟล์ข้อความที่สร้างขึ้นบน Windows นั้นเข้ากันได้ดีที่สุดในสามไฟล์นั่นคือมีแนวโน้มที่จะแสดงในระบบย่อยทั้งสามระบบหรือไม่?
โพร

3
@Hashim อาจแสดงอย่างถูกต้อง แต่การพยายามเรียกใช้สคริปต์เชลล์แบบข้อความพร้อมการคืนค่าขนส่งมักจะส่งผลให้เกิดข้อผิดพลาด
Omer

ในคำง่ายๆCR and LFเป็นเพียงจุดสิ้นสุดของบรรทัดและบรรทัดใหม่ตามลิงค์นี้ถูกต้องหรือไม่
shaijut

ฉันพบว่าไฟล์สไตล์ Windows บางไฟล์ ( CR+LF) สามารถแสดงผลได้ด้วยการขึ้นบรรทัดใหม่สองครั้งในระบบอื่น สมมุติว่าตัวแก้ไขที่แสดงข้อความรองรับทั้ง Carriage Return และ Line Feed เป็นตัวคั่นบรรทัดใหม่และอาจสร้าง 2 บรรทัดโดยที่ 1 ตั้งใจ ดังนั้นในขณะที่CR+LFอาจเข้ากันได้มากที่สุดฉันไม่คิดว่ามันจะไม่มีปัญหา
Magnus Bull

459

นี่เป็นบทสรุปที่ดีที่ฉันพบ:

อักขระ Carriage Return (CR) ( 0x0D, \r) เลื่อนเคอร์เซอร์ไปที่จุดเริ่มต้นของบรรทัดโดยไม่เลื่อนไปที่บรรทัดถัดไป อักขระนี้ใช้เป็นอักขระบรรทัดใหม่ในระบบปฏิบัติการ Commodore และ Early Macintosh (OS-9 และรุ่นก่อนหน้า)

อักขระ Line Feed (LF) ( 0x0A, \n) เลื่อนเคอร์เซอร์ลงไปที่บรรทัดถัดไปโดยไม่กลับไปที่จุดเริ่มต้นของบรรทัด อักขระนี้ใช้เป็นอักขระบรรทัดใหม่ในระบบที่ใช้ UNIX (Linux, Mac OSX และอื่น ๆ )

ลำดับ End of Line (EOL) ( 0x0D 0x0A, \r\n) เป็นอักขระ ASCII จริงสองตัวซึ่งเป็นการรวมกันของอักขระ CR และ LF มันเลื่อนเคอร์เซอร์ทั้งลงไปที่บรรทัดถัดไปและไปยังจุดเริ่มต้นของบรรทัดนั้น อักขระนี้ใช้เป็นอักขระบรรทัดใหม่ในระบบปฏิบัติการที่ไม่ใช่ Unix อื่น ๆ ส่วนใหญ่รวมถึง Microsoft Windows, Symbian OS และอื่น ๆ

แหล่ง


1
"แท็บแนวตั้ง" - อักขระเลื่อนเคอร์เซอร์ลงและรักษาตำแหน่งในบรรทัดไม่ใช่ตัวอักษร LF LF คือ EOL
12431234123412341234123

2
@TaylorLeese / r / n และ / n / r เหมือนกันหรือไม่
Vicrobot

175

เนื่องจากไม่มีคำตอบที่ระบุเพียงแค่นี้จึงสรุปรวบรัด:

Carriage Return (MAC pre-OSX)

  • CR
  • \ r
  • รหัส ASCII 13

Line Feed (Linux, MAC OSX)

  • LF
  • \ n
  • รหัส ASCII 10

Carriage Return และ Line Feed (Windows)

  • CRLF
  • \ r \ n
  • รหัส ASCII 13 และรหัส ASCII 10

หากคุณเห็นรหัส ASCII ในรูปแบบแปลก ๆ พวกมันเป็นเพียงหมายเลข 13 และ 10 ในฐาน / ฐานที่ต่างกันโดยทั่วไปคือฐาน 8 (ฐานแปด) หรือฐาน 16 (ฐานสิบหก)

http://www.bluesock.org/~willg/dev/ascii.html


46

Jeff Atwood มีบล็อกโพสต์ล่าสุดเกี่ยวกับเรื่องนี้: The Great Newline Schism

นี่คือสาระสำคัญจากWikipedia :

ลำดับ CR + LF เป็นสิ่งที่ใช้กันทั่วไปในระบบคอมพิวเตอร์ยุคแรก ๆ ที่ใช้เครื่องโทรพิมพ์โดยทั่วไปคือ ASR33 เป็นอุปกรณ์คอนโซลเพราะลำดับนี้จำเป็นต้องวางตำแหน่งเครื่องพิมพ์เหล่านั้นเมื่อเริ่มต้นบรรทัดใหม่ ในระบบเหล่านี้ข้อความมักถูกจัดทำเป็นประจำเพื่อให้เข้ากันได้กับเครื่องพิมพ์เหล่านี้เนื่องจากแนวคิดของไดรเวอร์อุปกรณ์ที่ซ่อนรายละเอียดฮาร์ดแวร์ดังกล่าวจากแอปพลิเคชันยังไม่ได้รับการพัฒนาอย่างดี แอปพลิเคชันต้องพูดคุยโดยตรงกับเครื่องโทรพิมพ์และทำตามอนุสัญญาการแยกฟังก์ชั่นทั้งสองนั้นปิดบังความจริงที่ว่าหัวพิมพ์ไม่สามารถย้อนกลับจากทางขวาสุดไปจนถึงจุดเริ่มต้นของบรรทัดถัดไปในเวลาเดียวได้ นั่นคือเหตุผลที่ลำดับถูกส่งไปพร้อมกับ CR ก่อนเสมอ ในความเป็นจริงมันมักจะจำเป็นต้องส่งตัวอักษรพิเศษ (ภายนอก CRs หรือ NULs ซึ่งจะถูกละเว้น) เพื่อให้เวลาหัวพิมพ์เพื่อย้ายไปที่ขอบด้านซ้าย แม้หลังจากที่คอมพิวเตอร์ถูกแทนที่ด้วยเทอร์มินัลคอมพิวเตอร์ด้วยอัตรารับส่งข้อมูลที่สูงขึ้นระบบปฏิบัติการหลายระบบยังคงรองรับการส่งอักขระเติมเหล่านี้โดยอัตโนมัติเพื่อให้เข้ากันได้กับเครื่องปลายทางที่ถูกกว่า


5
+1 มันเป็นความเข้าใจง่ายๆที่ฉันจำได้เสมอว่าลำดับใดที่จะมาพร้อมกัน แม้ทุกวันนี้เรายังคงเห็นตรรกะเชิงกลนี้ในเครื่องพิมพ์อิงค์เจ็ท (ฉันชอบที่จะเข้าใจตั้งแต่ฉันเกลียดที่จะเรียนรู้) เทคนิคหน่วยความจำอื่น ๆ ของฉันคือ: "mac? Return to sender" และ "NewLineFeed" (โปรดจำไว้ว่า NL === LF และจดจำ \ n เนื่องจาก CR มีตัวย่ออยู่ในนั้นอยู่แล้ว)
GitaarLAB

3
"ฉันสงสัย ... รหัสควบคุมสองตัวเป็นสิ่งจำเป็นสำหรับการกำหนดเวลา" นั่นไม่ใช่สิ่งที่พูด มันบอกว่า CRs และ NUL พิเศษอยู่ที่นี่เพื่อให้เวลาเพื่อให้มันกลับมาไม่ใช่ CR CR ดั้งเดิม
Julien Rousseau

11
@ เอเดรียคุณจะใช้ประสบการณ์ส่วนตัวหรือไม่ 1) ในวันที่โทรพิมพ์เก่าของฉันเครื่องพิมพ์ที่เราใช้ที่จำเป็น<CR><CR><LF>- <CR>ดังนั้นแน่นอนผมทดลองที่มีเพียงหนึ่ง ฉันส่งไป<CR><LF>Aหลังจากแถวยาวและคุณสามารถได้ยินเสียงที่Aถูกพิมพ์ก่อนที่แคร่จะกลับมาเต็ม
John Burger

11
@ เอเดรีย 2) อย่าลืมนี่เป็นยุคของเครื่องจักรกลไฟฟ้าที่ตัวละครแต่ละตัวทำหน้าที่เดียว เรามักจะเน้นคำด้วยการพิมพ์บรรทัดจากนั้นส่ง<CR><CR>และพิมพ์จำนวนช่องว่างที่ถูกต้องจากนั้นพิมพ์คำเดียวกันอีกครั้ง: รูปแบบดั้งเดิมของการพิมพ์เป็นตัวหนา
John Burger

3
@ เอเดรีย 3) และสุดท้ายนี้คือการใช้ Baudot (หรือรหัส Murray) ไม่ใช่ ASCII บิตข้อมูลห้าบิตระหว่างบิตเริ่มต้นหนึ่งและบิตหยุดหนึ่งและครึ่ง คุณมีครึ่งทางได้อย่างไร โดยรอสักครู่ก่อนเริ่มส่งตัวอักษรถัดไปเพื่อให้เวลาหัวพิมพ์เพื่อกลับไปที่กึ่งกลาง
John Burger

16

CR - รหัส ASCII 13

LF - รหัส ASCII 10

ในทางทฤษฎี CR ส่งคืนเคอร์เซอร์ไปที่ตำแหน่งแรก (ทางซ้าย) LF ดึงข้อมูลเคอร์เซอร์หนึ่งบรรทัดที่เลื่อนลงหนึ่งบรรทัด นี่คือวิธีในอดีตคุณควบคุมเครื่องพิมพ์และจอภาพโหมดข้อความ อักขระเหล่านี้มักใช้เพื่อทำเครื่องหมายจุดสิ้นสุดของบรรทัดในไฟล์ข้อความ ระบบปฏิบัติการที่แตกต่างกันใช้การประชุมที่แตกต่างกัน ในขณะที่คุณชี้ให้เห็นว่า Windows ใช้การรวม CR / LF ในขณะที่ pre-OSX Mac ใช้เพียง CR และอื่น ๆ


7

ระบบที่อิง ASCII หรือชุดอักขระที่เข้ากันได้ใช้ LF (Line feed, 0x0A, 10 เป็นทศนิยม) หรือ CR (Carriage return, 0x0D, 13 เป็นทศนิยม) แยกต่างหากหรือ CR ตามด้วย LF (CR + LF, 0x0D 0x0A); อักขระเหล่านี้ขึ้นอยู่กับคำสั่งของเครื่องพิมพ์: การป้อนบรรทัดระบุว่ากระดาษหนึ่งบรรทัดควรป้อนออกจากเครื่องพิมพ์และการคืนแคร่พิมพ์ระบุว่าการขนส่งเครื่องพิมพ์ควรกลับไปที่จุดเริ่มต้นของบรรทัดปัจจุบัน

นี่คือรายละเอียด


5

สถานะเศร้าของ "ตัวคั่นเร็กคอร์ด" หรือ "ตัวคั่นบรรทัด" เป็นมรดกของยุคคอมพิวเตอร์ที่มืดมน

ตอนนี้เราคิดว่าสิ่งที่เราต้องการนำเสนอนั้นเป็นข้อมูลที่มีโครงสร้างและสอดคล้องกับ abstractions ต่างๆที่กำหนดบรรทัดไฟล์โปรโตคอลข้อความสารมาร์กอัปอะไรก็ตาม

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

จริง ๆ แล้ว Unix และ Mac ระบุสิ่งที่เป็นนามธรรมสำหรับจุดสิ้นสุดบรรทัด, ลองจินตนาการดู. น่าเศร้าที่พวกเขาระบุสิ่งที่แตกต่าง (ยูนิกซ์อะแฮ่มมาก่อน) และตามธรรมชาติแล้วพวกเขาใช้รหัสควบคุมที่ "ใกล้" กับ SOP แล้ว

เนื่องจากซอฟต์แวร์ปฏิบัติการเกือบทั้งหมดของเราในวันนี้เป็นระบบปฏิบัติการของ Unix, Mac หรือ MS SW เราจึงติดอยู่กับความสับสนในการสิ้นสุดบรรทัด


1

NL มาจาก EBCDIC NL = x'15 'ซึ่งจะเปรียบเทียบกับ CRLF x'odoa ascii อย่างมีเหตุผล ... จะเห็นได้ชัดเมื่อข้อมูลทางกายภาพย้ายจากเมนเฟรมไปจนถึงระดับกลาง Coloquially (เป็นเพียงคน arcane ใช้ ebcdic) NL ได้รับการบรรจุด้วย CR หรือ LF หรือ CRLF

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