दिलचस्प पोस्ट
चयन तत्व का डिफ़ॉल्ट मान सेट करने के लिए एनजी-विकल्प का उपयोग कैसे करें जीजीप्लोट में विशेष चर (..काउंट .., ..density .., आदि) वीबी.नेट में क्लासेस बनाम मॉड्यूल डेटाबेस से सीएसवी फ़ाइल को निर्यात करें मेरे ऐप को एक उपकरण स्वामी कैसे बनाऊं? रेल और रूबी 1.9 के साथ अमान्य multibyte char (US-ASCII) ना एनएएन के बराबर है? बिटमैप को ImageView से जुड़ा हुआ है क्या किसी ने वास्तव में फाइबोनैचि-हीप को कुशलतापूर्वक लागू किया है? JSON.NET त्रुटि प्रकार के लिए स्वयं संदर्भित पाश पता चला मैं विंडोज पर पीपी कैसे स्थापित करूं? स्पार्क डेटाफ़्रेम का उपयोग करते हुए JSON डेटा कॉलम की क्वेरी कैसे करें? एक WCF सेवा के लिए प्रपत्र प्रमाणीकरण कुकी पासिंग HTTPModule घटना निष्पादन आदेश? JQuery के डिफर्ड ऑब्जेक्ट में एक त्रुटि फेंक

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

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

वेब के समाधान से एकत्रित समाधान "\ R और \ n के बीच अंतर क्या है?"

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

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

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

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

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

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

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

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

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

  1. प्रिंट सिर वापस लाइन की शुरुआत में ले जाएँ, फिर
  2. इसे अगली पंक्ति तक ले जाएं

एएससीआईआई इन कार्यों को दो विशिष्ट नियंत्रण वर्णों के रूप में एनकोड करता है:

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

टेलिटेप्स और प्रारंभिक टेक्नोलॉजी प्रिंटर के दिनों में, लोगों ने वास्तव में इस तथ्य का फायदा उठाया था कि ये दो अलग आपरेशन थे। एलएफ़ द्वारा इसे बिना किसी CR भेजकर, आप पहले से मुद्रित लाइन पर प्रिंट कर सकते हैं। यह लहजे, बोल्ड टाइप, और रेखांकन जैसे प्रभावों की अनुमति है। हार्डकॉपी में पासवर्ड दिखाई देने से रोकने के लिए कुछ सिस्टम कई बार अतिप्रतिष्ठित थे। प्रारंभिक सीरियल सीआरटी टर्मिनलों पर, सीआर स्क्रीन पर पहले से ही टेक्स्ट को अपडेट करने के लिए कर्सर स्थिति को नियंत्रित करने के एक तरीके थे।

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

तो, सी और सी ++ में:

  • \r वास्तव में एक गाड़ी वापसी है
  • \n एक जादू का मूल्य है जो होस्ट प्लेटफार्म के नए सिरेन्टिक्स से / से रन-टाइम पर (टेक्स्ट मोड में) अनुवाद किया जाता है।
  • \r\n लगभग हमेशा एक पोर्टेबिलिटी बग है। टेक्स्ट मोड में, यह प्लेट के नए लाइन अनुक्रम के बाद सीआर में अनुवादित हो जाता है – संभवत: क्या नहीं है द्विआधारी मोड में, यह सीआर में अनुवाद किया जाता है, जिसके बाद कुछ जादू मूल्य हो सकता है जो एलएफ नहीं हो सकता – संभवतः इसका क्या इरादा नहीं है
  • \x0A एएससीआईआई एलएफ को इंगित करने का सबसे पोर्टेबल तरीका है, लेकिन आप केवल बाइनरी मोड में ऐसा करना चाहते हैं। अधिकांश टेक्स्ट-मोड कार्यान्वयन इस तरह से व्यवहार करेगा जैसे \n
  • "\ r" => वापसी
  • "\ n" => न्यूलाइन या लाइनफीड (सीमेंटिक्स)

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

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

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

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

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

इस आउटपुट का उत्पादन करता है:

 hai 

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

@ जेन स्केट के उत्तर के अतिरिक्त:

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

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

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

\ r कैरिज रिटर्न के लिए उपयोग किया जाता है (एएससीआईआई मान 13 है) \ n नई लाइन के लिए प्रयोग किया जाता है (एएससीआईआई मान 10 है)