लिनक्स और विंडोज पर अलग-अलग तरीके से कैसे संभाला जाता है?


22

मुझे लगता \nहै कि सुई को नीचे ले जाता है, और \rसुई को एक पंक्ति (बाएं संरेखित) की शुरुआत में ले जाता है? मुझे यकीन नहीं है, हालांकि। इसलिए, अगर मैं गलत हूं तो कृपया मुझे सुधारें ...।

वैसे भी, मुझे बताया गया था कि विंडोज और लिनक्स संभाल newlinesऔर carriage returnsअलग तरह से। मैं जानना चाहूंगा कि वे उन्हें कैसे अलग तरीके से और कुछ जगहों पर संभालते हैं, जहां यह याद रखना महत्वपूर्ण है। जवाब के लिए धन्यवाद।


अब तक मुझे पता है कि \r\nविंडोज में ठीक है, लेकिन \n\rनहीं है, और मुझे याद है कि क्योंकि \r\nपंजीकृत नर्स के लिए एक संक्षिप्त है। मैं यह भी सुनता हूं \nकि लोग लिनक्स में क्या उपयोग करते हैं और \rउसी उद्देश्य के लिए अकेले उपयोग नहीं किया जाता है \r\n\rवास्तव में पुराने MacOS में उपयोग किया जाता है। हालांकि मैंने इन तथ्यों को सत्यापित नहीं किया है।
千里 ゃ

4
उन्हें कॉल न करें \rऔर \n, क्योंकि कैसे \nसंभाला जाता है यह इस बात पर निर्भर करता है कि आप इसका उपयोग कहां कर रहे हैं। उन्हें कॉल करने के लिए बेहतर है CRऔर LF
इग्नासियो वाज़केज़-अब्राम्स

इग्नासियो, उन समरूपों का मेरे लिए कोई अर्थ नहीं है। आप इसे किस नाम से पुकारते हैं :/? ओह ... लाइन फ़ीड और कार्गो रिटर्न्स। धन्यवाद, sleske
千里 ゃ

@ IgnacioVazquez-Abrams LF के समान नहीं है? किसी भी ASCII चार्ट पर, वर्ण 13 = \ n = LF नहीं है?
बार्लोप

1
@barlop: विंडोज में आउटपुट करते समय C में नहीं।
इग्नासियो वाज़क्वेज़-अब्राम्स

जवाबों:


21

मुझे लगता है कि \ n सुई को नीचे ले जाती है, और \ r सुई को एक पंक्ति (बाएं संरेखित) की शुरुआत में ले जाती है? मुझे यकीन नहीं है, हालांकि

यह सच है, कम या ज्यादा, लेकिन ज्यादातर एक ऐतिहासिक जिज्ञासा है। मूल रूप से, प्रिंटर और हार्डकॉपी टर्मिनलों ( टेलीप्रिंटर्स ) पर एक पंक्ति द्वारा कागज को आगे बढ़ाने के लिए लाइनफीड (एलएफ) का उपयोग किया गया था ; कैरिज रिटर्न (सीआर) ने प्रिंट हेड को लाइन की शुरुआत में लौटा दिया।

यह संभवतः "पाठ मोड" में उपयोग किए जाने पर आधुनिक प्रिंटर पर काम करता है, लेकिन आज थोड़ी प्रासंगिकता है।

वैसे भी, मुझे बताया गया था कि विंडोज और लिनक्स नए सिरे से संभालते हैं और गाड़ी अलग तरह से लौटती है।

अंतर बस इतना है: ओएस डिजाइनरों को यह चुनना था कि कंप्यूटर फ़ाइलों में पाठ में एक नई पंक्ति की शुरुआत का प्रतिनिधित्व कैसे करें। विभिन्न ऐतिहासिक कारणों के लिए, यूनिक्स / लिनक्स दुनिया में एक एलएफ चरित्र को न्यूलाइन मार्कर के रूप में चुना गया था; MS-DOS ने CR + LF को चुना और Windows को यह विरासत में मिला। इस प्रकार विभिन्न प्लेटफॉर्म विभिन्न सम्मेलनों का उपयोग करते हैं।

व्यवहार में, यह एक समस्या का कम और कम होता जा रहा है। न्यूलाइन मार्कर वास्तव में केवल "सादे पाठ" की प्रक्रिया करने वाले पोग्राम के लिए प्रासंगिक है, और कई ऐसे नहीं हैं - यह ज्यादातर प्रोग्राम सोर्स कोड, कॉन्फ़िगरेशन फ़ाइलों और प्रलेखन के साथ कुछ सरल पाठ फ़ाइलों को प्रभावित करता है। आजकल अधिकांश प्रोग्राम इन प्रकार की फाइलों (संपादकों, संकलकों आदि) को संभालने के बाद दोनों नई परंपराओं को संभाल सकते हैं, इसलिए इससे कोई फर्क नहीं पड़ता कि आप किसे चुनते हैं।

कुछ ऐसे मामले हैं जहां उपकरण "उनके" नएलाइन कन्वेंशन पर जोर देते हैं (जैसे यूनिक्स शेल स्क्रिप्ट में सीआर + एलएफ का उपयोग नहीं करना चाहिए), जिस स्थिति में आपको सही उपयोग करना चाहिए।


पूछताछ की एक ही पंक्ति: क्या प्रोग्रामिंग भाषाएं पहचानती हैं \n\rऔर \nसमान हैं? उदाहरण के लिए, यदि मैं एक पाठ फ़ाइल को पार्स कर रहा था जिसे किसी और के पीसी पर संपादित किया गया था और जिसमें लाइन ब्रेक के लिनक्स और विंडोज दोनों संस्करण शामिल थे, एक प्रदर्शन करेंगेpreg_match के लिए \nऔर \n\rमुझे अलग परिणाम दे सकता है?
千里 ゃ

@ @ On ゃ ん: यह पूरी तरह से प्रोग्रामिंग लैंग्वेज, कंपाइलर आदि पर निर्भर करता है। विशेष रूप से, यदि आप रेगेक्स का उपयोग करते हैं, तो यह आपके द्वारा उपयोग किए जाने वाले रेक्सक्स इंजन पर निर्भर करेगा - कुछ अलग-अलग लाइन एंडिंग को अलग करते हैं, कुछ नहीं करते हैं (अधिकतर दोनों तरह से कॉन्फ़िगर किया जा सकता है,) मेरा मानना ​​है)।
सालेके

@ @ A ゃ ん: यदि आपके मन में सवाल है कि कुछ सिस्टम / प्रोग्रामिंग लैंग्वेज / रेगुलर एक्सप्रेशन इंजन अलग-अलग न्यूलाइन कन्वेंशन को कैसे हैंडल करते हैं, तो इसे एक अलग सवाल के रूप में पूछें।
सालेके

जैसा कि आप कर रहे हैं आप गलत तरीके से नहीं लिख रहे हैं। प्रोग्रामिंग भाषाओं के रूप में, वे व्यक्तिगत पात्रों को पढ़ने में सक्षम होंगे और आप प्रोग्रामर को देख सकते हैं जो इनपुट में उपयोग किया जाता है, और आप प्रोग्रामर भी आउटपुट के लिए इच्छा के अनुसार कर सकते हैं। जैसा कि आप कह सकते हैं कि "एबीसी लिखो जिसके बाद \ r \ r \ r \ n" जो भी वर्ण आप अंत में रहना चाहते हैं! कुछ अन्य वर्ण गैर-मुद्रण योग्य हो सकते हैं और कोई चित्रमय या जो भी हो। वे कुछ ऐसे कार्यों में निर्मित हो सकते हैं जैसे कि प्रिंटलैन, और वे अपनी नई लाइन के लिए जो उपयोग करते हैं वह एक या दूसरे से होगा, यह दोनों नहीं हो सकता है।
बार्लोप

@ @ May ゃ ん और कुछ प्रोग्रामिंग लैंग्वेज आपको यह बता सकती हैं कि कौन से लिने को उनके एक फंक्शन्स में बनाया गया है, इसलिए यहां तक ​​कि बिल्ट इन फंक्शन में भी। + जैसा कि उल्लेख किया गया है, व्यवहार में आप जो भी लाइन समाप्त करना चाहते हैं, उसे लिख सकते हैं ... हालांकि आप प्रिंटलाइन फ़ंक्शन के साथ इतनी कुशलता से नहीं कर सकते हैं।
बार्लोप

14

सीआर और एलएफ

सूचना का आदान-प्रदान के लिए अमेरिकन स्टैंडर्ड कोड (ASCII) में CARRIAGE-RETURN (CR) और LINE-FEED (LF) सहित नियंत्रण-वर्ण परिभाषित किए गए (और अभी भी) प्रिंटर के प्रिंट-पोज़िशन को एक समान रूप से नियंत्रित करने के लिए उपयोग किए जाते हैं यांत्रिक टाइपराइटर जो प्रारंभिक कंप्यूटर प्रिंटर से पहले थे।

मंच पर निर्भरता

विंडोज में टेक्स्ट फाइलों में पारंपरिक लाइन-सेपरेटर LF के बाद CR है

पुराने (पूर्व OSX) में Apple Macintosh सिस्टम पारंपरिक फ़ाइलों को पाठ फ़ाइलों में अलग करता था

यूनिक्स और लिनक्स में, पाठ फ़ाइलों में पारंपरिक लाइन-विभाजक एलएफ है।

\ n और \ r

कई प्रोग्रामिंग और स्क्रिप्टिंग भाषाओं में \n"नई लाइन" का मतलब है। कभी-कभी (लेकिन हमेशा नहीं) इसका मतलब है ASCII लाइन-फीड वर्ण (LF), जो, जैसा कि आप कहते हैं, कर्सर (या प्रिंट स्थिति) को एक पंक्ति से नीचे ले जाता है। एक प्रिंटर या टाइपराइटर में, यह वास्तव में पेपर को एक पंक्ति में ले जाएगा।

हमेशा का \rअर्थ है ASCII CARRIAGE-RETURN वर्ण (CR) जिसका नाम वास्तव में यांत्रिक टाइपराइटर से आता है जहां एक गाड़ी-वापसी कुंजी थी जो रोलर ("कैरिज") का कारण बनती थी जो एक वसंत द्वारा संचालित दाईं ओर जाने के लिए कागज को ले जाती थी। जहाँ तक जाएगा। इस प्रकार वर्तमान टाइपिंग स्थिति को बाएं मार्जिन पर सेट करें।

प्रोग्रामिंग

कुछ प्रोग्रामिंग भाषाओं में \n में एक पाठ फ़ाइल में लाइनों को समाप्त या अलग करने वाले वर्णों का एक प्लेटफ़ॉर्म-निर्भर अनुक्रम हो सकता है। उदाहरण के लिए पर्ल में, print "\n"विंडोज की तुलना में लिनक्स पर वर्णों का एक अलग क्रम बनाता है।

जावा में, सबसे अच्छा अभ्यास, यदि आप रनटाइम प्लेटफॉर्म के लिए देशी लाइन एंडिंग का उपयोग करना चाहते हैं, तो उपयोग \nया \rबिल्कुल भी नहीं है। आपको उपयोग करना चाहिए System.getProperty("line.separator")। आपको उपयोग करना चाहिए\n\r प्लेटफ़ॉर्म की परवाह किए बिना LF और CR का और (जैसे HTTP, FTP और अन्य इंटरनेट संचार प्रोटोकॉल में उपयोग किया जाता है)।

यूनिक्स स्टटी

एक यूनिक्स शेल में, stty कमांड का उपयोग इन विभिन्न सम्मेलनों के बीच शेल का अनुवाद करने के लिए किया जा सकता है। उदाहरण के लिए stty -onlcrशेल बाद में सभी निवर्तमान एलएफ को सीआर एलएफ में अनुवाद करेगा।

लिनक्स और OSX यूनिक्स सम्मेलनों का पालन करते हैं

पाठ फ़ाइलें

पाठ फ़ाइलें अभी भी बहुत महत्वपूर्ण हैं और व्यापक रूप से उपयोग की जाती हैं। उदाहरण के लिए, HTML और XML पाठ फ़ाइल के उदाहरण हैं। HTTP जैसे अधिकांश महत्वपूर्ण इंटरनेट प्रोटोकॉल, पाठ-फ़ाइल सम्मेलनों का अनुसरण करते हैं और लाइन-एंडिंग के लिए विशिष्टताओं को शामिल करते हैं।

प्रिंटर

बहुत सस्ते के अलावा अधिकांश प्रिंटर, अभी भी सीआर और एलएफ का सम्मान करते हैं। वास्तव में वे सबसे व्यापक रूप से इस्तेमाल की जाने वाली पृष्ठ विवरण भाषाओं - पीसीएल और पोस्टस्क्रिप्ट के लिए मौलिक हैं।


1
जावा पर ध्यान दें: यह आम तौर पर सच नहीं है कि आपको "\ n या \ r का उपयोग नहीं करना चाहिए"। यह सिर्फ इतना है कि जावा में, "\ n" हमेशा LF होता है, और "\ r" हमेशा CR होता है। यह सिर्फ वही हो सकता है जो आप चाहते हैं: यदि आप एक विशिष्ट लाइन एंडिंग स्टाइल चाहते हैं, तो उनका उपयोग करें; यदि आप स्पष्ट रूप से उस कंप्यूटर की मूल पंक्ति को समाप्त करना चाहते हैं जिस पर आप चल रहे हैं, तो उपयोग करें line.separator। यह वास्तव में आप क्या चाहते हैं पर निर्भर करता है।
सिल्के

और BTW, println()स्वचालित रूप से उपयोग करता है line.separator, इसलिए यदि आप देशी लाइन एंडिंग चाहते हैं, तो आप उपयोग कर सकते हैं println()(और यदि आपको एक निश्चित विशिष्ट प्रकार की लाइन समाप्त होने की आवश्यकता है, तो इसका उपयोग न करें, लेकिन "\ n" आदि का स्पष्ट रूप से उपयोग करें)।
सिल्के

@ साल्सके: अच्छे अंक। मैं उसी हिसाब से अपना जवाब अपडेट करूंगा।
RedGrittyBrick 10

1
क्या ऐसी कोई भाषा या संकलक हैं जहां \nASCII LF (EBCDIC- आधारित प्रणालियों के अलावा) के अलावा एक नियंत्रण चरित्र है? मैं \nएक स्ट्रिंग या चरित्र शाब्दिक में क्या मतलब है, यह एक फ़ाइल या आउटपुट डिवाइस पर भेजने के प्रभाव के लिए नहीं है।
कीथ थॉम्पसन

1
@KeithThompson: जावा के लिए: हाँ, \nहमेशा ASCII (और यूनिकोड) कोड 10 होता है, क्योंकि JLS इतने स्पष्ट रूप से कहता है (JLS 3.10.6, "कैरेक्टर और स्ट्रिंग लिटरल के लिए एस्केप सीक्वेंस" - मैंने जाँच की :-))। अन्य भाषाओं के लिए - अच्छा सवाल।
11

4

संक्षेप में, प्रिंटर के लिए आवश्यक था, लेकिन अब OSes इसे थोड़ा अलग तरीके से करते हैं। ज्यादातर मामलों में, यह सीआर और एलएफ दोनों को करने के लिए ठीक है \r\nऔर ज्यादातर मामलों में, यह ठीक काम करेगा।


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