पर हास्केल में यूनिकोड कंसोल I/O विंडोज़ के तहत हास्केल में यूनिकोड वर्णों के साथ काम करने के लिए कंसोल I/O प्राप्त करना मुश्किल लगता है। यहाँ शोक की कहानी है:विंडोज
- (प्रारंभिक।) इससे पहले कि आप भी खिड़कियों के तहत कंसोल में कर यूनिकोड आई/ओ पर विचार करें, आप यह सुनिश्चित करें कि आप एक सांत्वना फ़ॉन्ट जो वर्ण प्रदान कर सकते हैं का उपयोग कर रहे बनाने की जरूरत है तुम्हें चाहिए। रास्टर फोंट (डिफ़ॉल्ट) में असीमित रूप से खराब कवरेज होता है (और उन वर्णों की प्रतिलिपि बनाने की अनुमति न दें जिन्हें वे प्रतिनिधित्व नहीं कर सकते हैं), और ट्रूटाइप विकल्प एमएस प्रदान करता है (कंसोलस, लुसीडा कंसोल) में बहुत अच्छा कवरेज नहीं है (हालांकि ये अनुमति देंगे उन पात्रों की प्रतिलिपि/पेस्टिंग जो वे प्रतिनिधित्व नहीं कर सकते हैं)। आप DejaVu Sans Mono इंस्टॉल करने पर विचार कर सकते हैं (नीचे here पर निर्देशों का पालन करें; आपको इसे काम करने से पहले रीबूट करना पड़ सकता है)। जब तक यह सॉर्ट नहीं किया जाता है, तब तक कोई भी ऐप्स यूनिकोड I/O नहीं कर पाएगा; सिर्फ हास्केल नहीं।
- ऐसा करने के बाद, आप देखेंगे कि कुछ ऐप्स विंडोज़ के तहत कंसोल I/O करने में सक्षम होंगे। लेकिन इसे काम करने के लिए काफी जटिल बना हुआ है। खिड़कियों के नीचे कंसोल को लिखने के मूल रूप से दो तरीके हैं। (किसी भी भाषा के लिए क्या सही है, न केवल हास्केल; चिंता न करें, हास्केल थोड़ी देर में तस्वीर दर्ज करेगा!) ...
- विकल्प ए सामान्य सी-लाइब्रेरी शैली बाइट-आधारित i/ओ कार्य; आशा है कि ओएस कुछ एन्कोडिंग के अनुसार इन बाइट्स की व्याख्या करेगा जो आपके इच्छित सभी अजीब और अद्भुत पात्रों को एन्कोड कर सकता है। उदाहरण के लिए, मैक ओएस एक्स पर समतुल्य तकनीक का उपयोग करते हुए, जहां मानक सिस्टम एन्कोडिंग आमतौर पर यूटीएफ 8 होता है, यह बहुत अच्छा काम करता है; आप utf8 आउटपुट भेजते हैं, आप सुंदर प्रतीक देखते हैं।
- विंडोज़ पर, यह कम अच्छी तरह से काम करता है। विंडोज़ की अपेक्षा की जाने वाली डिफ़ॉल्ट एन्कोडिंग आम तौर पर सभी यूनिकोड प्रतीकों को कवर करने वाला एन्कोडिंग नहीं होगी। इसलिए यदि आप इस तरह से सुंदर प्रतीकों को देखना चाहते हैं, एक तरफ या किसी अन्य, आपको एन्कोडिंग को बदलने की आवश्यकता है। आपके प्रोग्राम के लिए
SetConsoleCP
win32 कमांड का उपयोग करने की संभावना एक संभावना होगी। (तो फिर आपको Win32 लाइब्रेरी से जुड़ना होगा।) या, यदि आप ऐसा नहीं करना चाहते हैं, तो आप अपने प्रोग्राम के उपयोगकर्ता को कोड पेज बदलने की उम्मीद कर सकते हैं (फिर उन्हें चलाने से पहलेchcp
कमांड को कॉल करना होगा आपका कार्यक्रम)। - विकल्प बी यूनिकोड-जागरूक win32 कंसोल एपीआई कमांड जैसे
WriteConsoleW
का उपयोग करना है। यहां आप विंडोज़ को सीधे यूटीएफ 16 भेजते हैं, जो इसे खुशी से प्रस्तुत करता है: एन्कोडिंग विसंगति का कोई खतरा नहीं है क्योंकि विंडोज हमेशा इन कार्यों के साथ यूटीएफ 16 की अपेक्षा करता है।
दुर्भाग्य से, इनमें से कोई भी विकल्प हास्केल से बहुत अच्छा काम नहीं करता है। सबसे पहले, ऐसी कोई पुस्तकालय नहीं है जो मुझे पता है कि विकल्प बी का उपयोग करें, इसलिए यह बहुत आसान नहीं है। यह विकल्प ए छोड़ देता है। यदि आप हास्केल की I/O लाइब्रेरी (putStrLn
और इसी तरह) का उपयोग करते हैं, तो लाइब्रेरी यही करेगी। हास्केल के आधुनिक संस्करणों में, यह सावधानीपूर्वक विंडोज़ से पूछेगा कि वर्तमान कोड पेज क्या है, और उचित तारों में अपने तारों को आउटपुट करें। इस दृष्टिकोण के साथ दो समस्याएं हैं:
- कोई शोस्टॉपर नहीं है, लेकिन परेशान है। जैसा ऊपर बताया गया है, डिफ़ॉल्ट एन्कोडिंग लगभग आपके इच्छित अक्षरों को एन्कोड नहीं करेगा: आपको उपयोगकर्ता को एन्कोडिंग में बदलने की आवश्यकता है जो करता है। इस प्रकार आपके उपयोगकर्ता को आपके प्रोग्राम चलाने से पहले
chcp cp65001
की आवश्यकता होती है (आप इसे अपने उपयोगकर्ताओं को ऐसा करने के लिए मजबूर कर सकते हैं)। या आपकोSetConsoleCP
से जुड़ना होगा और अपने प्रोग्राम के समतुल्य समतुल्य करना होगा (और फिरhSetEncoding
का उपयोग करें ताकि हास्केल लाइब्रेरी नए एन्कोडिंग का उपयोग करके आउटपुट भेज सकें), जिसका अर्थ है कि आपको Win32 पुस्तकालयों के प्रासंगिक भाग को Haskell बनाने के लिए लपेटने की आवश्यकता है -visible। - अधिक गंभीरता से, bug in windows (रिज़ॉल्यूशन: ठीक नहीं होगा) जो की ओर जाता है जिसका अर्थ है कि यदि आपने सीपी 65001 जैसे किसी भी कोड पेज का चयन किया है जो यूनिकोड के सभी को कवर कर सकता है, हास्केल के आई/ओ रूटीन खराब हो जाएंगे और असफल तो अनिवार्य रूप से, भले ही आप (या आपका उपयोगकर्ता) एन्कोडिंग को कुछ एन्कोडिंग में ठीक से सेट करते हैं जो सभी अद्भुत यूनिकोड वर्णों को कवर करता है, और फिर उस एन्कोडिंग का उपयोग करके आउटपुट चीजों को आउटपुट करने के लिए हास्केल को बताने में 'सब कुछ ठीक करें', आप अभी भी हार जाते हैं।
ऊपर सूचीबद्ध बग अभी भी अनसुलझा है और कम प्राथमिकता के रूप में सूचीबद्ध है; मूल निष्कर्ष यह है कि विकल्प ए (उपरोक्त मेरे वर्गीकरण में) अप्रभावी है और विश्वसनीय परिणामों को प्राप्त करने के लिए किसी को विकल्प बी पर स्विच करने की आवश्यकता है। यह स्पष्ट नहीं है कि इस समाधान के लिए समय सीमा क्या होगी, क्योंकि यह कुछ महत्वपूर्ण काम की तरह दिखता है।
सवाल यह है कि: इस बीच, क्या कोई भी विंडोज़ के तहत हास्केल में यूनिकोड कंसोल I/O के उपयोग की अनुमति देने के लिए एक समाधान का सुझाव दे सकता है।
भी देखें इस python bug tracker database entry,, अजगर 3 (ठीक प्रस्तावित है, लेकिन अभी तक codebase में स्वीकार नहीं), और this stackoverflow answer में एक ही समस्या के साथ जूझ अजगर में इस समस्या के लिए एक समाधान दे (पर 'विकल्प बी' में स्थित मेरा वर्गीकरण)।
मुझे यकीन नहीं है कि मैंने उन सभी का पालन किया है, लेकिन यदि यह विंडोज़ पर कंसोल आईओ करने का सही तरीका है, तो आप एक [पुस्तकालय प्रस्ताव तैयार करने के बारे में कैसा महसूस करेंगे ] (http://www.haskell.org/haskellwiki/Library_submissions) इन कार्यों को Win32 पैकेज में जोड़ने के लिए और/या इन कार्यों को बेस लाइब्रेरी के 'putStrLn' आदि से कॉल करें)? –
@DanielWagner: ठीक है, मुझे लगता है कि यह देखने के लिए थोड़ा सा इंतजार हो सकता है कि किसी और के पास कोई सुझाव है या नहीं ... मैं काफी हद तक निश्चित हूं कि मैं जो करता हूं वह Win32/यूनिकोड बिंदु दृश्य से 'दाएं' है ; कम निश्चित यह हैस्केल में बेनकाब करने के लिए सबसे अच्छा इंटरफ़ेस है। एक और बात यह है कि मुझे शायद वरिष्ठ रखरखावकर्ताओं से हाथ से पकड़े जाने की संख्या की आवश्यकता होगी, मैं इसे 'आधिकारिक' बनाने की कोशिश कर रहा था: मैंने पहले कभी कोर हास्केल पुस्तकालयों को हैक नहीं किया है। इसलिए (यह देखते हुए कि इस मुद्दे को आधिकारिक तौर पर कम प्राथमिकता दी गई है) मुझे चिंता है कि यह वरिष्ठ रखरखाव के समय को बर्बाद कर सकता है। –
@DanielWagner; ओटीओएच, मानते हुए कि कोई अन्य जवाब नहीं है, और यदि आपको लगता है कि रखरखाव एक सुझाए गए पैच का स्वागत करेंगे, तो मुझे उपरोक्त को पुस्तकालय प्रस्ताव के रूप में, समय पर अनुमति देने के लिए बहुत खुशी होगी। –