คำเตือน - \ r \ n หรือ \ n \ r?


390

ฉันจำไม่ได้ ดังนั้นวิธีที่ถูกต้องในการยุติสาย ASCII แบบเก่าคืออะไร?


11
ถ้าคุณทำเช่นนี้ทำให้แน่ใจว่าคุณจะเปิดไฟล์ของคุณในโหมดไบนารี มิฉะนั้นสตรีมไฟล์ C / C ++ มาตรฐานจะแปลง "\ n" (สำหรับไฟล์ข้อความ (ค่าเริ่มต้น)) เป็นแพลตฟอร์มสิ้นสุดลำดับบรรทัด (ELS) โดยเฉพาะ ดังนั้น "\ r \ n" บน windows จะแปลงเป็น "\ r \ r \ n" บนฟิสิคัลดิสก์ หมายเหตุ: หากคุณใช้ C / C ++ เพื่ออ่านไฟล์กลับคุณจะไม่สังเกตุว่า ELS จะถูกแปลงกลับเป็น "\ n" เมื่ออ่านจากไฟล์
Martin York

@ Martin - ฉันอยู่ใน. net และกำลังใช้ (ตัวอย่างนี้) File.AppendAllText ด้วย "\ r \ n" และฉันเพิ่งดูไฟล์และไม่มีการทำซ้ำที่ส่วนท้ายของ เส้น. มายากล?
Daniel Mošmondor

@Daniel: ฉันควรจะเจาะจงมากขึ้น C / C ++ลำธาร เมื่อเชื่อมโยงกับไฟล์และเปิดในโหมดข้อความ นอกจากนี้ยังขึ้นอยู่กับว่าคุณดูไฟล์อย่างไร (ใช้ hexeditor)
Martin York

@Martin - ใช้ PSPad ในโหมด hex ...
Daniel Mošmondor

1
บนคีย์บอร์ดโบราณปุ่ม Enter ถูกเรียกว่าปุ่ม Return ดังนั้นการส่งคืนจึงมาก่อนจากนั้น Linefeed จะถูกสร้างขึ้นเพื่อตอบสนอง มันชัดเจนมากเมื่อคุณมีประวัติศาสตร์มากเกินไป
Mark Ransom

คำตอบ:


1084

ฉันจะใช้คำว่า ' r etur n ' เพื่อจำไว้ว่า r มาก่อนหน้า n


116
และจำไว้ว่าคำที่จะใช้เป็นผลตอบแทนจำไว้ว่า \ r คือกลับสายการบิน อย่าลืมว่า "Return" เป็นชื่อของคีย์บนคีย์บอร์ด Mac หรือไม่เช่นนั้นคุณอาจมองไปที่คีย์บอร์ดพีซีดูที่ปุ่ม "Enter" และสั่งตัวอักษรผิด!
Rob Kennedy

3
@ David แต่ผมสงสัยว่าผลของการที่\n\rและ\r\nจะเหมือนกันไม่ได้ที่พวกเขาทำผลเช่นเดียวกัน? คุณบอกความแตกต่างได้ไหม
Mr.Anubis

7
@ Mr.Anubis หากคุณมีเครื่องพิมพ์ดอทเมทริกซ์บางตัวก็ไม่ควรมีความแตกต่างเนื่องจากลำดับของคำสั่งไม่ควรสำคัญ อย่างไรก็ตามสำหรับเครื่องพิมพ์บางเครื่องคุณจะได้รับบรรทัดว่างเปล่าเพิ่มเติมหรือไม่มีการเลื่อนบรรทัดเลย และทุกอย่างที่กล่าวไว้ข้างต้นใช้กับโปรแกรมแก้ไขข้อความ - พวกเขาจะสับสนคลาส TextStream จะป่วยและอื่น ๆ คำสั่งซื้อเป็นสิ่งสำคัญ :)
Daniel Mošmondor

12
@ DanielMošmondorอีกวิธีหนึ่งคุณสามารถจำได้ว่าคำสั่งนั้นคือ impoRtaNt หรือเมื่อคุณถามใครบางคนใน SO จึงให้ RemiNder แก่คุณซึ่งคุณลืมในภายหลัง หรือว่าคุณไม่สามารถใช้นามสกุลของคุณเป็นตัวเตือนเพราะคำสั่งของ R และ n มีการกลับรายการ :)
แดเนียล Daranas

5
@ RobKennedy ฮ่าฮ่าคุณรู้ว่าฉันมาที่นี่และอ่านเกี่ยวกับการกลับมาและคิดว่า "ยอดเยี่ยม!" จากนั้นฉันก็อ่านความคิดเห็นของคุณ ตอนนี้ทุกครั้งที่ฉันจำไม่ได้ว่าจะต้องใช้กุญแจตัวไหนฉันจะดูที่ปุ่ม "Enter" และฉันก็คิดว่า "มีบางอย่างผิดปกติที่นี่" ... ฮ่าฮ่ากว่าที่คิด!
Wayne Uroda

53

หากคุณกำลังใช้ C # คุณควรใช้Environment.NewLineซึ่งตาม MSDN มันคือ:

สตริงที่มี "\ r \ n" สำหรับแพลตฟอร์มที่ไม่ใช่ Unix หรือสตริงที่มี "\ n" สำหรับแพลตฟอร์ม Unix


46
ที่จริงแล้วประเภทนี้ขึ้นอยู่กับสิ่งที่คุณทำ หากคุณเพียงแค่ส่งข้อความธรรมดาไปยังคอนโซลหรือลงในไฟล์เพื่อใช้งานในพื้นที่Environment.NewLineก็ถือว่าใช้ได้ อย่างไรก็ตามหากคุณกำลังเขียนสิ่งต่าง ๆ ในรูปแบบที่กำหนดไว้อย่างดีรูปแบบอาจกำหนดบรรทัดใหม่ด้วย ตัวอย่างเช่นโปรโตคอล HTTP ระบุว่าคุณต้องใช้\r\nเป็นตัวยุติบรรทัดสำหรับส่วนหัว ฯลฯ โดยไม่คำนึงถึงแพลตฟอร์ม
Matti Virkkunen

3
ใช่นี่เป็นคำแนะนำที่ไม่ดีจริงๆ
IvanP

นี่คือเหตุผลที่คุณต้องหลีกเลี่ยงข้อความเว็บของคุณและสร้างการทดสอบหน่วยเพื่อยืนยันการส่ง \ r \ n (windows), \ r (mac), \ n (linux) ส่งอย่างถูกต้องเป็น \ r \ n ไปยังเว็บเซิร์ฟเวอร์
TamusJRoyce

37

บรรทัดใหม่ขึ้นอยู่กับระบบปฏิบัติการของคุณ:

DOS & Windows: \r\n 0D0A (hex), 13,10 (decimal)
Unix & Mac OS X: \n, 0A, 10
Macintosh (OS 9): \r, 0D, 13

รายละเอียดเพิ่มเติมได้ที่นี่: https://ccrma.stanford.edu/~craig/utility/flip/

เมื่อมีข้อสงสัยให้ใช้ตัวดู hex / editor ฟรีแวร์เพื่อดูว่าไฟล์เข้ารหัสบรรทัดใหม่อย่างไร

สำหรับผมผมใช้ตามคู่มือที่จะช่วยฉันจำ: 0D0A = \ r \ n = CR, LF = ca RR iage rกลับสู่หลี่nอีฟีด


7
แปลกพอผมเป็นหนึ่งในคนเหล่านี้ที่รู้0D0Aด้วยหัวใจ แต่ยังคงสับสนและ\r \n
Nyerguds

1
หรือฉันจำได้ว่า \ r คือ carriage return และ \ n เป็นตัวดึงข้อมูลบรรทัด ... เป็นเพียงฉันจำคำสั่งไม่ได้ดังนั้นจึงไม่ช่วยในการจดจำว่าอันใดคือ 0D และอันไหนเป็น 0A;)
Nyerguds

20

ลำดับคือ CR (Carriage Return) - LF (Line Feed) จำเครื่องพิมพ์ดอทเมทริกซ์ได้หรือไม่ เผง ดังนั้น - ลำดับที่ถูกต้องคือ \ r \ n


ฉันคิดว่านี่เป็นคำตอบที่สมเหตุสมผลที่สุด
David Snabel-Caunt

12
LF + CR จะทำ CR + LF เดียวกันกับเครื่องพิมพ์
ikegami

10
ฉันไม่เห็นด้วย @David แค่คิดว่าเครื่องพิมพ์ดอทเมทริกซ์ (หรือเครื่องพิมพ์ดีดสำหรับเรื่องนี้เพราะพวกเขาเป็นคนที่มีรถม้าที่จะส่งคืน) ไม่เพียงพอ มีเพียงข้อมูลพื้นฐานเกี่ยวกับวิธีการทำงานไม่มีเหตุผลที่จะคิดว่ามันสำคัญว่าเราจะพัฒนาบทความก่อนหรือหลังกลับไปที่จุดเริ่มต้นของบรรทัด ทั้ง \ r \ n และ \ n \ r วางกระดาษในตำแหน่งเดียวกัน
Rob Kennedy

@ikegami บนเครื่องพิมพ์ส่วนใหญ่ไม่ใช่ทั้งหมด พวกเขายังมีสวิตช์ DIP เพื่อกำหนดค่าลักษณะการทำงานนั้น :)
Daniel Mošmondor

5
เหตุผลหนึ่งที่ทำให้การป้อนบรรทัดหลังจากการขึ้นบรรทัดกลับคือการลดจำนวนเวลาทั้งหมดที่ต้องใช้ - ในขณะที่หัวกลับไปที่ขอบด้านซ้ายของกระดาษแผ่นแท่นสามารถทำดัชนีหนึ่งบรรทัด การดำเนินการที่ยาวนานขึ้นเริ่มต้นก่อนดังนั้นการดำเนินการทั้งหมดจึงเสร็จสิ้นในเวลาที่ใช้การดำเนินการที่ยาวนานกว่าในการดำเนินการ เราทำหลายสิ่งหลายอย่างด้วยเหตุผลเช่นนั้น ลองนึกภาพรอสองสามร้อยบรรทัดที่ baud ...
Jerry Andrews

8

ใน. NET .NET ใด ๆEnvironment.NewLineก็น่าจะดีกว่า


ไม่ทำงานสำหรับสตริงคงที่ เมื่อจำเป็นต้องใช้ดีกว่าไม่ใช้ค่าคงที่และใช้สตริงแบบคงที่แทน)
TamusJRoyce

5

ระมัดระวังในการทำสิ่งนี้ด้วยตนเอง
ในความเป็นจริงฉันจะแนะนำไม่ทำเลย

ในความเป็นจริงเรากำลังพูดถึงลำดับการยกเลิกสาย LTS ที่เฉพาะกับแพลตฟอร์ม

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

ดังนั้นหากคุณพิมพ์ "\ r \ n" ลงในไฟล์ windows คุณจะได้รับลำดับ "\ r \ r \ n" ในไฟล์จริง (ดูด้วยโปรแกรมแก้ไขฐานสิบหก)

แน่นอนว่านี่เป็นความเจ็บปวดอย่างแท้จริงเมื่อพูดถึงการถ่ายโอนไฟล์ระหว่างแพลตฟอร์ม

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


4

\r\n สำหรับ Windows จะทำได้ดี


ซิงเกิ้ล\nก็ใช้ได้กับ windows เช่นกันรวมถึง Notepad เวอร์ชันล่าสุด
André Caron

ฉันคิดว่าบรรณาธิการที่ทันสมัยจะตรวจจับจุดสิ้นสุดของบรรทัดเนื่องจากระบบปฏิบัติการที่แตกต่างกันใช้จุดสิ้นสุดที่แตกต่างกัน
David Snabel-Caunt

1
ไม่จริง: หากคุณพิมพ์สิ่งนี้ลงในไฟล์ (ไฟล์ std C / C ++ ที่เปิดในโหมดข้อความ) บน windows ไฟล์จริงจะมี "\ r \ r \ n" (ตรวจสอบด้วยโปรแกรมแก้ไข hex) เมื่อคุณอ่านกลับ "\ r \ n" จะถูกแปลงกลับเป็น "\ n" เดียว
Martin York

2
ที่จริงแล้ว @DavidCaunt ฉันเพิ่งลอง \ n และมันไม่ทำงานกับ notepad ใน Win8
philk

4

จากWikipedia (คุณสามารถอ่านสิ่งที่ถูกต้องสำหรับระบบปฏิบัติการของคุณในบทความนั้น):

ระบบที่อิงตาม ASCII หรือชุดอักขระที่เข้ากันได้ใช้ LF (Line feed, '\ n', 0x0A, 10 ในรูปทศนิยม) หรือ CR (Carriage return, '\ r', 0x0D, 13 ในรูปทศนิยม) ทีละตัวหรือ CR ตามด้วย LF (CR + LF, '\ r \ n', 0x0D0A)


3

\r\n

แปลกที่จะบอกว่าฉันจำได้เพราะมันเป็นสิ่งที่ตรงกันข้ามกับเครื่องพิมพ์ดีดที่ฉันใช้
ถ้าเป็นเรื่องปกติฉันไม่จำเป็นต้องจำมัน ...:-)

เครื่องพิมพ์ดีดจากวิกิพีเดีย *ภาพจาก Wikipedia

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

คุณสามารถฟังจากบันทึกนี้จาก freesound.orgเสียงของการป้อนกระดาษในตอนเริ่มต้นและประมาณ -1: 03 วินาทีจากท้ายหลังจากเสียงเตือนเมื่อจบเสียงสายของกลองที่ม้วนและหลัง หนึ่งในค่าขนส่งคืนสินค้า


2

หากคุณใช้ C # ทำไมไม่ใช้Environment.NewLine? (ฉันถือว่าคุณใช้ออบเจ็กต์ตัวเขียนไฟล์บางอย่าง ... เพียงแค่ผ่านมันEnvironment.NewLineและมันจะจัดการกับเทอร์มิเนเตอร์ที่ถูกต้อง

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