\ R और \ n के बीच क्या अंतर है?


245

कैसे \rऔर \nअलग हैं? मुझे लगता है कि इसका यूनिक्स बनाम विंडोज बनाम मैक के साथ कुछ करना है, लेकिन मुझे यकीन नहीं है कि वे कैसे अलग हैं, और जो रेगीज़ में / मैच के लिए खोज करते हैं।


1
इसके लिए भाषा का टैग चाहिए। विभिन्न भाषाओं की अलग-अलग व्याख्या है '\n'
एड्रियन मैकार्थी

जवाबों:


383

वे अलग-अलग पात्र हैं। \rगाड़ी वापसी है, और \nलाइन फीड है।

"पुराने" प्रिंटर पर, \rप्रिंट सिर को लाइन की शुरुआत में वापस भेज दिया, और \nकागज को एक लाइन से उन्नत किया। इसलिए अगली पंक्ति में छपाई शुरू करने के लिए दोनों आवश्यक थे।

जाहिर है कि अब कुछ हद तक अप्रासंगिक है, हालांकि कंसोल के आधार पर आप अभी भी \rलाइन की शुरुआत में जाने और मौजूदा पाठ को अधिलेखित करने के लिए उपयोग करने में सक्षम हो सकते हैं ।

इससे भी महत्वपूर्ण बात, यूनिक्स \nएक लाइन विभाजक के रूप में उपयोग करने के लिए जाता है; Windows \r\nएक लाइन विभाजक के रूप में उपयोग करने के लिए जाता है और Mac (OS 9 तक) लाइन विभाजक के रूप में उपयोग किया जाता है \r। (मैक ओएस एक्स यूनिक्स-वाई है, इसलिए \nइसके बजाय उपयोग करता है ; \rहालांकि कुछ अनुकूल परिस्थितियां हो सकती हैं, हालांकि इसके बजाय इसका उपयोग किया जाता है।)

अधिक जानकारी के लिए, विकिपीडिया newline लेख देखें

EDIT: यह भाषा के प्रति संवेदनशील है। उदाहरण के लिए C # और Java में, \n हमेशा यूनिकोड U + 000A का अर्थ होता है, जिसे लाइन फीड के रूप में परिभाषित किया गया है। C और C ++ में, पानी कुछ हद तक मुडिएर है, क्योंकि इसका अर्थ प्लेटफ़ॉर्म-विशिष्ट है। विवरण के लिए टिप्पणियाँ देखें।


22
बूढ़े लोगों के लिए +1। टर्मिनल आउटपुट का उपयोग सीधे एक महिमामंडित इलेक्ट्रॉनिक टर्मिनल को नियंत्रित करने के लिए किया जाता है (आपका TTY उन फैंसी CRT डिस्प्ले से पहले)। इसलिए, हमें गाड़ी वापसी और न्यूलाइन पात्रों (जो दोनों की आवश्यकता हो सकती है, जैसा कि जॉन स्कीट ने उल्लेख किया है) की अद्भुत कलाकृतियां मिलती हैं और \ "घंटी", \ b "बैकस्पेस" जैसी चीजों को हटा दिया जाता है "), और सभी अन्य नियंत्रण वर्णों को एक छोटे से संवाद करने की आवश्यकता है।
एग्जिआंग

35
बूढ़े लोगों के लिए एक और +1। आप अभी भी Ctrl + G को विंडोज़ कमांड प्रॉम्प्ट, हिट एंटर पर हिट कर सकते हैं, और पीसी स्पीकर बीप करेंगे। वह प्राचीन काल से बचा हुआ है।
1933 में डेव कार्लाइल

@ क्रैपी कोडिंग गाय वास्तव में? विस्टा पर, यह बस "" आंतरिक या बाहरी कमांड के रूप में मान्यता प्राप्त नहीं है "
पोंकडूडल

2
@ AdrianMcCarthy: बेशक सवाल वास्तव में यहाँ C या C ++ निर्दिष्ट नहीं करता है। सी # में, उदाहरण के लिए \n कर रहा है नई पंक्ति (खंड 2.4.4.4) होने की गारंटी। बेशक, यह अच्छा होगा यदि ओपी ने मंच निर्दिष्ट किया है ... इसके अलावा, मुझे लगता है कि विस्तार का यह स्तर किसी के लिए उपयोगी की तुलना में अधिक भ्रामक होगा बस अंतर पूछ रहा है।
जॉन स्कीट

2
@AdrianMcCarthy: लेकिन कम से कम सी # और जावा में, यह है लाइन फ़ीड। यह U + 000A है, जिसे यूनिकोड ने "LINE FEED" (और NEW LINE) नाम दिया है। मैं C और C ++ के विशेष मामले का उल्लेख संपादित करेंगे, लेकिन मैं सच में विश्वास है कि उन लोगों के हैं विशेष मामलों, नहीं इसका उल्टा।
जॉन स्कीट

91

सी और सी ++ में, \nएक अवधारणा है, \rएक चरित्र है, और \r\nएक पोर्टेबिलिटी बग है (लगभग हमेशा)।

एक पुराने टेलेटाइप के बारे में सोचें। प्रिंट हेड को कुछ लाइन और कुछ कॉलम में तैनात किया गया है। जब आप मुद्रण योग्य वर्ण को टेलेटाइप पर भेजते हैं, तो यह वर्ण को वर्तमान स्थिति में प्रिंट करता है और सिर को अगले स्तंभ पर ले जाता है। (यह वैचारिक रूप से टाइपराइटर के समान है, सिवाय इसके कि टाइपराइटर आम तौर पर पेपर को प्रिंट हेड के संबंध में स्थानांतरित करते हैं।)

जब आप वर्तमान लाइन को समाप्त करना चाहते हैं और अगली पंक्ति पर शुरू करना चाहते हैं, तो आपको दो अलग-अलग चरण करने होंगे:

  1. प्रिंट हेड को फिर से लाइन की शुरुआत में ले जाएं
  2. इसे अगली पंक्ति में ले जाएं।

ASCII इन क्रियाओं को दो अलग-अलग नियंत्रण वर्णों के रूप में एन्कोड करता है:

  • \x0D(सीआर) लाइन की शुरुआत में प्रिंट हेड को वापस ले जाता है। (यूनिकोड इस रूप में एन्कोड करता है U+000D CARRIAGE RETURN।)
  • \x0A(LF) प्रिंट हेड को अगली पंक्ति में ले जाता है। (यूनिकोड इस रूप में एन्कोड करता है U+000A LINE FEED।)

टेलेटिप और शुरुआती प्रौद्योगिकी प्रिंटर के दिनों में, लोगों ने वास्तव में इस तथ्य का लाभ उठाया कि ये दो अलग-अलग ऑपरेशन थे। एक LF द्वारा इसका पालन किए बिना एक सीआर भेजकर, आप पहले से ही मुद्रित लाइन पर प्रिंट कर सकते हैं। यह उच्चारण, बोल्ड प्रकार, और रेखांकित करने जैसे प्रभावों की अनुमति देता है। कुछ प्रणालियों ने पासवर्ड को हार्डकॉपी में दिखाई देने से रोकने के लिए कई बार ओवरप्रिंट किया। प्रारंभिक धारावाहिक सीआरटी टर्मिनलों पर, सीआर स्क्रीन पर पहले से ही पाठ को अद्यतन करने के लिए कर्सर की स्थिति को नियंत्रित करने के तरीकों में से एक था।

लेकिन ज्यादातर समय, आप वास्तव में सिर्फ अगली पंक्ति में जाना चाहते थे। नियंत्रण वर्णों की जोड़ी की आवश्यकता के बजाय, कुछ प्रणालियों ने सिर्फ एक या दूसरे को अनुमति दी। उदाहरण के लिए:

  • यूनिक्स वेरिएंट (मैक के आधुनिक संस्करण सहित) एक नई पंक्ति को इंगित करने के लिए सिर्फ एलएफ चरित्र का उपयोग करते हैं।
  • पुरानी (प्री-ओएसएक्स) मैकिंटोश फाइलें एक नई रेखा को इंगित करने के लिए सिर्फ एक सीआर चरित्र का उपयोग करती हैं।
  • वीएमएस, सीपी / एम, डॉस, विंडोज, और कई नेटवर्क प्रोटोकॉल अभी भी दोनों की उम्मीद करते हैं: सीआर एलएफ।
  • पुराने IBM सिस्टम जो EBCDIC का उपयोग करते थे, NL पर मानकीकृत - एक ऐसा चरित्र जो ASCII वर्ण सेट में भी मौजूद नहीं है। यूनिकोड में, NL है U+0085 NEXT LINE, लेकिन वास्तविक EBCDIC मान है 0x15

अलग-अलग प्रणालियों ने अलग-अलग तरीके क्यों चुने? केवल इसलिए कि कोई सार्वभौमिक मानक नहीं था। जहाँ आपका कीबोर्ड शायद "एन्टर" कहता है, पुराने कीबोर्ड "रिटर्न" कहते थे, जो कैरिज रिटर्न के लिए छोटा था। वास्तव में, एक सीरियल टर्मिनल पर, रिटर्न दबाकर वास्तव में सीआर चरित्र भेजता है। यदि आप एक टेक्स्ट एडिटर लिख रहे हैं, तो यह उस चरित्र का उपयोग करने के लिए आकर्षक होगा जैसा कि टर्मिनल से आया था। शायद इसीलिए पुराने मैक सिर्फ CR का इस्तेमाल करते थे।

अब जब हमारे पास मानक हैं , तो लाइन ब्रेक का प्रतिनिधित्व करने के अधिक तरीके हैं । हालांकि जंगली में अत्यंत दुर्लभ, यूनिकोड में नए पात्र हैं:

  • U+2028 LINE SEPARATOR
  • U+2029 PARAGRAPH SEPARATOR

यूनिकोड के साथ आने से पहले ही, प्रोग्रामर अंतर्निहित चरित्र सेट के बारे में चिंता किए बिना सबसे उपयोगी नियंत्रण कोड का प्रतिनिधित्व करने के लिए सरल तरीके चाहते थे। C में नियंत्रण कोड का प्रतिनिधित्व करने के लिए कई भागने के क्रम हैं:

  • \a (अलर्ट के लिए) जो टेलेटाइप घंटी बजाता है या टर्मिनल बीप बनाता है
  • \f (फॉर्म फीड के लिए) जो अगले पेज की शुरुआत में जाता है
  • \t (टैब के लिए) जो प्रिंट सिर को अगले क्षैतिज टैब स्थिति में ले जाता है

(यह सूची जानबूझकर अधूरी है।)

यह मानचित्रण संकलन-समय पर होता है - संकलनकर्ता देखता है \aऔर घंटी बजाने के लिए जो भी जादुई मूल्य का उपयोग किया जाता है वह करता है।

ध्यान दें कि इनमें से अधिकांश mnemonics का ASCII नियंत्रण कोड से सीधा संबंध है। उदाहरण के लिए, \aमैप करेगा 0x07 BEL। एक कंपाइलर एक सिस्टम के लिए लिखा जा सकता है जो होस्ट कैरेक्टर सेट (जैसे, EBCDIC) के लिए ASCII के अलावा कुछ और इस्तेमाल करता है। विशिष्ट नियंत्रण कोड वाले अधिकांश नियंत्रण कोडों को अन्य वर्ण सेटों में कोडों को नियंत्रित करने के लिए मैप किया जा सकता है।

हुज़्ज़ाह! पोर्टेबिलिटी!

हां तकरीबन। सी में, मैं लिख सकता था printf("\aHello, World!");कि कौन सी घंटी बजती है (या बीप्स) और एक संदेश आउटपुट करता है। लेकिन अगर मैं अगली पंक्ति में कुछ प्रिंट करना चाहता था, तो मुझे अभी भी यह जानना होगा कि होस्ट प्लेटफॉर्म को आउटपुट की अगली पंक्ति में जाने की क्या आवश्यकता है। सीआर एलएफ? सीआर? वामो? NL? कुछ और? पोर्टेबिलिटी के लिए इतना।

C में I / O के लिए दो मोड हैं: बाइनरी और टेक्स्ट। बाइनरी मोड में, जो भी डेटा भेजा जाता है, वह प्रसारित होता है। लेकिन टेक्स्ट मोड में, एक रन-टाइम अनुवाद है जो एक विशेष चरित्र को एक नई लाइन (और इसके विपरीत) के लिए होस्ट प्लेटफॉर्म की आवश्यकता के लिए परिवर्तित करता है।

महान, तो विशेष चरित्र क्या है?

ठीक है, यह कार्यान्वयन निर्भर है, भी, लेकिन इसे लागू करने के लिए एक कार्यान्वयन-स्वतंत्र तरीका है \n:। इसे आम तौर पर "न्यूलाइन कैरेक्टर" कहा जाता है।

यह एक सूक्ष्म लेकिन महत्वपूर्ण बिंदु है: कार्यान्वयन-परिभाषित चरित्र मान के लिए संकलन समय\n पर मैप किया जाता है जो (पाठ मोड में) फिर से चलने के लिए अंतर्निहित प्लेटफॉर्म द्वारा आवश्यक वास्तविक चरित्र (या वर्णों के अनुक्रम) के लिए चलाने के समय पर फिर से मैप किया जाता है अगली पंक्ति के लिए।

\nअन्य सभी बैकलैश शाब्दिकों से अलग है क्योंकि इसमें दो मैपिंग शामिल हैं। यह दो-चरण मानचित्रण की \nतुलना में भी काफी भिन्न होता है \r, जो सीआर (या अंतर्निहित चरित्र सेट में सबसे समान नियंत्रण कोड) के लिए बस एक संकलन-समय मानचित्रण है।

यह कई C और C ++ प्रोग्रामर को ट्रिप करता है। यदि आप उनमें से 100 को मतदान करने के लिए थे, तो कम से कम 99 आपको बताएंगे कि \nलाइन फीड। यह पूरी तरह से सच नहीं है। अधिकांश (शायद सभी) C और C ++ कार्यान्वयन LF का उपयोग जादू मध्यवर्ती मान के रूप में करते हैं \n, लेकिन यह एक कार्यान्वयन विवरण है। यह एक संकलक के लिए एक अलग मूल्य का उपयोग करने के लिए संभव है। वास्तव में, यदि मेजबान वर्ण सेट ASCII का सुपरसेट नहीं है (उदाहरण के लिए, यदि यह EBCDIC है), तो \nलगभग निश्चित रूप से LF नहीं होगा।

तो, C और C ++ में:

  • \r सचमुच एक गाड़ी वापसी है।
  • \nएक जादू मूल्य है जो होस्ट प्लेटफ़ॉर्म के न्यूलाइन शब्दार्थ से रन-टाइम पर (पाठ मोड में) अनुवादित हो जाता है ।
  • \r\nलगभग हमेशा एक पोर्टेबिलिटी बग होता है। पाठ मोड में, यह सीआर के लिए मंच के न्यूलाइन अनुक्रम के बाद अनुवादित हो जाता है - शायद इसका इरादा नहीं है। बाइनरी मोड में, इसका सीआर के लिए अनुवाद किया जाता है जिसके बाद कुछ जादू मूल्य होता है जो कि एलएफ नहीं हो सकता है - संभवतः इसका इरादा नहीं है।
  • \x0AASCII LF को इंगित करने का सबसे पोर्टेबल तरीका है, लेकिन आप केवल बाइनरी मोड में ऐसा करना चाहते हैं। अधिकांश टेक्स्ट-मोड कार्यान्वयन इस तरह का व्यवहार करेंगे \n

पायथन में <textarea> इनपुट को विभाजित करने का तरीका जानने की कोशिश करते हुए इस पोस्ट के पार आया, और \r\nवास्तव में एकमात्र तरीका है कि मैं अलग-अलग सूची तत्वों में लाइनों को ठीक से विभाजित कर सकता हूं। यह मुझे आश्चर्यचकित करता है कि क्या यह कुछ अजीब एचटीएमएल विरूपण साक्ष्य है, या अगर यह उस तरीके से करना है जो पायथन मेरी requestवस्तु से स्ट्रिंग को निगलेगा ।
पैट जोन्स

11
  • "ए आर" => वापसी
  • "एन +" => न्यूलाइन या लाइनफीड (शब्दार्थ)

  • यूनिक्स आधारित प्रणाली पाठ की एक पंक्ति को समाप्त करने के लिए सिर्फ एक "\ n" का उपयोग करती है।

  • डॉस पाठ की एक पंक्ति को समाप्त करने के लिए "\ r \ n" का उपयोग करता है।
  • कुछ अन्य मशीनों ने सिर्फ एक "r" का उपयोग किया है। (कमोडोर, एप्पल II, मैक ओएस से पहले ओएस एक्स आदि।)

5

\r एक लाइन की शुरुआत को इंगित करने के लिए उपयोग किया जाता है और पाठ को वहां से प्रतिस्थापित कर सकता है, जैसे

main()
{
printf("\nab");
printf("\bsi");
printf("\rha");
}

इस उत्पादन का उत्पादन:

hai

\n नई लाइन के लिए है।


4

शॉर्ट \ r में ASCII का मूल्य 13 (CR) और \ n का ASCII मान 10 (LF) है। मैक सीआर का उपयोग लाइन सीमांकक के रूप में करता है (कम से कम, यह पहले किया था, मैं आधुनिक मैक के लिए निश्चित नहीं हूं), * निक्स एलएफ का उपयोग करता है और विंडोज दोनों (सीआरएलएफ) का उपयोग करता है।


1
मैक ओएस एक्स सिस्टम डिफ़ॉल्ट रूप से एलएफ का उपयोग करते हैं (क्योंकि यह बीएसडी यूनिक्स पर आधारित है)।
ड्रीमलैक्स

3

@Jon Skeet के जवाब के अलावा:

परंपरागत रूप से विंडोज़ ने \ r \ n, यूनिक्स \ n और मैक \ r का उपयोग किया है, हालाँकि नए मैक उपयोग कर रहे हैं क्योंकि वे यूनिक्स आधारित हैं।


2

C # में मैंने पाया कि वे एक स्ट्रिंग में \ r \ n का उपयोग करते हैं।


2

\ r कैरिज रिटर्न है; \ n नई लाइन (लाइन फीड) है ... प्रत्येक साधन के रूप में ओएस पर निर्भर करता है। C में '\ n' और '\ r \ n' ... के अंतर पर अधिक के लिए यह लेख पढ़ें ।


1

\ r गाड़ी वापसी के लिए उपयोग किया जाता है। (ASCII मान 13 है) \ n नई लाइन के लिए उपयोग किया जाता है। (ASCII मूल्य 10 है)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.