2010-09-06 12 views
5

हास्केल में '\ n' या '\ r \ n' जैसे मूल न्यूलाइन अक्षरों को निर्धारित करने का सबसे अच्छा तरीका क्या है?मूल न्यूलाइन अक्षर?

मुझे लगता है कि जीएचसी.आईओ: हैंडल में "मूल न्यूलाइन" फ़ंक्शन है, लेकिन मान लें कि यह एक निजी एपीआई और अधिकांश गैर-मानक हास्केल दोनों हैं।

उत्तर

9

आपको यूटीएफ -8 की तरह फाइल सिस्टम में संग्रहीत टेक्स्ट फ़ाइल के एन्कोडिंग के हिस्से के रूप में न्यूलाइन प्रस्तुति के बारे में सोचना चाहिए। जब आप इसे अपने प्रोग्राम में पढ़ते हैं तो टेक्स्ट फ़ाइल को सामान्य रूप से डीकोड किया जाता है, और लिखित होने पर एन्कोड किया जाता है - मूल एन्कोडिंग और डीकोडिंग के हिस्से के रूप में मूल न्यूलाइन प्रतिनिधित्व में कनवर्ट करना होता है। अपने हास्केल प्रोग्राम के अंदर, जैसे कि वर्णों को उनके यूनिकोड कोड बिंदुओं द्वारा दर्शाया जाता है, न्यूलाइन कैरेक्टर हमेशा \n होता है।

I/O सिस्टम को उस न्यूलाइन एन्कोडिंग के बारे में बताने के लिए जो आप उपयोग करना चाहते हैं, सिस्टम.आईओ के लिए प्रलेखन में Newline Conversion पर अनुभाग देखें।

+0

तो अगर मैं स्मृति में फ़ाइल उत्पन्न करूंगा (जैसा कि डेटा.Text कहता है), मुझे किसी भी मामले में विंडोज़ पर भी '\ n' का उपयोग करना चाहिए? – LennyStackOverflow

+4

हां। जब आप फ़ाइल में टेक्स्ट लिखते हैं तो '\ r \ n' का अनुवाद तब होगा। –

+0

ठीक है, साइमन धन्यवाद। – LennyStackOverflow

2

System.IO.nativeNewline निजी नहीं है - आप इसे पता लगाने के लिए क्या GHC समझता है मूल "न्यू लाइन" वर्तमान मंच पर होना करने के लिए उपयोग कर सकते हैं।

ध्यान दें कि इस चर के प्रकार, System.IO.Newline, में Show उदाहरण जीएचसी 6.12.3 के रूप में नहीं है। तो आप आसानी से अपना मूल्य प्रिंट नहीं कर सकते हैं। इसके बजाय, यह देखने के लिए जांचें कि यह से System.IO.LF या System.IO.CRLF के बराबर है या नहीं।

लेकिन, जैसा कि साइमन ने कहा, आप आवश्यकता नहीं होनी चाहिए पाठ उन्मुख आईओ कार्यों GHC में के सामान्य उपयोग के साथ देशी न्यू लाइन अनुक्रम के बारे में पता करने के लिए।

यह चर, आईओ सिस्टम की शेष नई यूनिकोड-जागरूक क्षमताओं के साथ, अभी तक हास्केल मानक का हिस्सा नहीं है। इसे Haskell 2010 report में शामिल नहीं किया गया था। हालांकि, चूंकि यह पहले से ही जीएचसी, में लागू किया गया है और यह काफी व्यापक सहमति है कि यह महत्वपूर्ण और उपयोगी है, उम्मीद है कि इसे मानक में आने वाले वार्षिक संशोधन में शामिल किया जाएगा।

+0

उत्तर के लिए धन्यवाद। मेरा कोड शुद्ध है और इस प्रकार आईओ के बारे में नहीं है। आप डेटा.Text के भीतर इसे कैसे हल करेंगे? – LennyStackOverflow

+1

'देशी न्यूलाइन' निरंतर आईओ मोनैड में नहीं है, इसलिए आप इसे शुद्ध कोड में उपयोग कर सकते हैं। यह सिर्फ एक मॉड्यूल में स्थित होता है जिसका नाम "System.IO'" है, क्योंकि इसका उपयोग आम तौर पर किसी फ़ाइल या उपयोगकर्ता-दृश्य डिवाइस पर पाठ पढ़ने और लिखने के संदर्भ में किया जाता है। असल में, मुझे यकीन नहीं है कि अगर आप बाहरी दुनिया के साथ किसी भी पाठ की जानकारी का आदान-प्रदान नहीं कर रहे हैं तो आपको मूल न्यूलाइन अनुक्रम के बारे में क्यों पता होना चाहिए। – Yitz

+0

इसे कंक्रीट बनाने के लिए: मैं डेटा के साथ स्मृति में लेटेक्स फ़ाइलों को उत्पन्न कर रहा हूं। टेक्स्ट। मुझे यकीन नहीं है कि लाइनों को कैसे अलग किया जाए। क्या मुझे हार्ड-कोडेड '\ n' का उपयोग करना चाहिए? मुझे नहीं पता कि इन-मेमोरी फाइलों के साथ क्या होने जा रहा है, चाहे वह किसी फाइल पर लिखा गया हो, स्क्रीन पर प्रदर्शित किया गया हो या सिर्फ लाइनों पर गिना गया हो। साइमन के जवाब से मेरे पास इंप्रेशन है, मैं हार्ड-कोडेड '\ n' का उपयोग कर सकता हूं और हास्केल का आईओ स्वचालित रूप से इसे विंडोज़ पर '\ r \ n' में परिवर्तित कर देगा। – LennyStackOverflow

संबंधित मुद्दे