जवाबों:
वे अलग-अलग पात्र हैं। \r
गाड़ी वापसी है, और \n
लाइन फीड है।
"पुराने" प्रिंटर पर, \r
प्रिंट सिर को लाइन की शुरुआत में वापस भेज दिया, और \n
कागज को एक लाइन से उन्नत किया। इसलिए अगली पंक्ति में छपाई शुरू करने के लिए दोनों आवश्यक थे।
जाहिर है कि अब कुछ हद तक अप्रासंगिक है, हालांकि कंसोल के आधार पर आप अभी भी \r
लाइन की शुरुआत में जाने और मौजूदा पाठ को अधिलेखित करने के लिए उपयोग करने में सक्षम हो सकते हैं ।
इससे भी महत्वपूर्ण बात, यूनिक्स \n
एक लाइन विभाजक के रूप में उपयोग करने के लिए जाता है; Windows \r\n
एक लाइन विभाजक के रूप में उपयोग करने के लिए जाता है और Mac (OS 9 तक) लाइन विभाजक के रूप में उपयोग किया जाता है \r
। (मैक ओएस एक्स यूनिक्स-वाई है, इसलिए \n
इसके बजाय उपयोग करता है ; \r
हालांकि कुछ अनुकूल परिस्थितियां हो सकती हैं, हालांकि इसके बजाय इसका उपयोग किया जाता है।)
अधिक जानकारी के लिए, विकिपीडिया newline लेख देखें ।
EDIT: यह भाषा के प्रति संवेदनशील है। उदाहरण के लिए C # और Java में, \n
हमेशा यूनिकोड U + 000A का अर्थ होता है, जिसे लाइन फीड के रूप में परिभाषित किया गया है। C और C ++ में, पानी कुछ हद तक मुडिएर है, क्योंकि इसका अर्थ प्लेटफ़ॉर्म-विशिष्ट है। विवरण के लिए टिप्पणियाँ देखें।
\n
कर रहा है नई पंक्ति (खंड 2.4.4.4) होने की गारंटी। बेशक, यह अच्छा होगा यदि ओपी ने मंच निर्दिष्ट किया है ... इसके अलावा, मुझे लगता है कि विस्तार का यह स्तर किसी के लिए उपयोगी की तुलना में अधिक भ्रामक होगा बस अंतर पूछ रहा है।
सी और सी ++ में, \n
एक अवधारणा है, \r
एक चरित्र है, और \r\n
एक पोर्टेबिलिटी बग है (लगभग हमेशा)।
एक पुराने टेलेटाइप के बारे में सोचें। प्रिंट हेड को कुछ लाइन और कुछ कॉलम में तैनात किया गया है। जब आप मुद्रण योग्य वर्ण को टेलेटाइप पर भेजते हैं, तो यह वर्ण को वर्तमान स्थिति में प्रिंट करता है और सिर को अगले स्तंभ पर ले जाता है। (यह वैचारिक रूप से टाइपराइटर के समान है, सिवाय इसके कि टाइपराइटर आम तौर पर पेपर को प्रिंट हेड के संबंध में स्थानांतरित करते हैं।)
जब आप वर्तमान लाइन को समाप्त करना चाहते हैं और अगली पंक्ति पर शुरू करना चाहते हैं, तो आपको दो अलग-अलग चरण करने होंगे:
ASCII इन क्रियाओं को दो अलग-अलग नियंत्रण वर्णों के रूप में एन्कोड करता है:
\x0D
(सीआर) लाइन की शुरुआत में प्रिंट हेड को वापस ले जाता है। (यूनिकोड इस रूप में एन्कोड करता है U+000D CARRIAGE RETURN
।)\x0A
(LF) प्रिंट हेड को अगली पंक्ति में ले जाता है। (यूनिकोड इस रूप में एन्कोड करता है U+000A LINE FEED
।)टेलेटिप और शुरुआती प्रौद्योगिकी प्रिंटर के दिनों में, लोगों ने वास्तव में इस तथ्य का लाभ उठाया कि ये दो अलग-अलग ऑपरेशन थे। एक LF द्वारा इसका पालन किए बिना एक सीआर भेजकर, आप पहले से ही मुद्रित लाइन पर प्रिंट कर सकते हैं। यह उच्चारण, बोल्ड प्रकार, और रेखांकित करने जैसे प्रभावों की अनुमति देता है। कुछ प्रणालियों ने पासवर्ड को हार्डकॉपी में दिखाई देने से रोकने के लिए कई बार ओवरप्रिंट किया। प्रारंभिक धारावाहिक सीआरटी टर्मिनलों पर, सीआर स्क्रीन पर पहले से ही पाठ को अद्यतन करने के लिए कर्सर की स्थिति को नियंत्रित करने के तरीकों में से एक था।
लेकिन ज्यादातर समय, आप वास्तव में सिर्फ अगली पंक्ति में जाना चाहते थे। नियंत्रण वर्णों की जोड़ी की आवश्यकता के बजाय, कुछ प्रणालियों ने सिर्फ एक या दूसरे को अनुमति दी। उदाहरण के लिए:
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
लगभग हमेशा एक पोर्टेबिलिटी बग होता है। पाठ मोड में, यह सीआर के लिए मंच के न्यूलाइन अनुक्रम के बाद अनुवादित हो जाता है - शायद इसका इरादा नहीं है। बाइनरी मोड में, इसका सीआर के लिए अनुवाद किया जाता है जिसके बाद कुछ जादू मूल्य होता है जो कि एलएफ नहीं हो सकता है - संभवतः इसका इरादा नहीं है।\x0A
ASCII LF को इंगित करने का सबसे पोर्टेबल तरीका है, लेकिन आप केवल बाइनरी मोड में ऐसा करना चाहते हैं। अधिकांश टेक्स्ट-मोड कार्यान्वयन इस तरह का व्यवहार करेंगे \n
।\r\n
वास्तव में एकमात्र तरीका है कि मैं अलग-अलग सूची तत्वों में लाइनों को ठीक से विभाजित कर सकता हूं। यह मुझे आश्चर्यचकित करता है कि क्या यह कुछ अजीब एचटीएमएल विरूपण साक्ष्य है, या अगर यह उस तरीके से करना है जो पायथन मेरी request
वस्तु से स्ट्रिंग को निगलेगा ।
"एन +" => न्यूलाइन या लाइनफीड (शब्दार्थ)
यूनिक्स आधारित प्रणाली पाठ की एक पंक्ति को समाप्त करने के लिए सिर्फ एक "\ n" का उपयोग करती है।
\r
एक लाइन की शुरुआत को इंगित करने के लिए उपयोग किया जाता है और पाठ को वहां से प्रतिस्थापित कर सकता है, जैसे
main()
{
printf("\nab");
printf("\bsi");
printf("\rha");
}
इस उत्पादन का उत्पादन:
hai
\n
नई लाइन के लिए है।
शॉर्ट \ r में ASCII का मूल्य 13 (CR) और \ n का ASCII मान 10 (LF) है। मैक सीआर का उपयोग लाइन सीमांकक के रूप में करता है (कम से कम, यह पहले किया था, मैं आधुनिक मैक के लिए निश्चित नहीं हूं), * निक्स एलएफ का उपयोग करता है और विंडोज दोनों (सीआरएलएफ) का उपयोग करता है।
\ r कैरिज रिटर्न है; \ n नई लाइन (लाइन फीड) है ... प्रत्येक साधन के रूप में ओएस पर निर्भर करता है। C में '\ n' और '\ r \ n' ... के अंतर पर अधिक के लिए यह लेख पढ़ें ।
\ r गाड़ी वापसी के लिए उपयोग किया जाता है। (ASCII मान 13 है) \ n नई लाइन के लिए उपयोग किया जाता है। (ASCII मूल्य 10 है)
'\n'
।