बिना use utf8
पर्ल एकल बाइट पात्रों के अनुक्रम के रूप में आपकी स्ट्रिंग की व्याख्या करता है। आपकी स्ट्रिंग में चार बाइट्स हैं जैसा कि आप इससे देख सकते हैं:
$ perl -E 'say join ":", map { ord } split //, "鸡\n";'
233:184:161:10
पहले तीन बाइट्स आपके चरित्र को बनाते हैं, अंतिम एक लाइन-फीड है।
कॉल print
इन चार वर्णों को STDOUT पर भेजता है। तब आपका कंसोल इन वर्णों को प्रदर्शित करने का तरीका बताता है। यदि आपका कंसोल UTF8 का उपयोग करने के लिए सेट है, तो यह उन तीन बाइट्स को आपके एकल वर्ण के रूप में व्याख्या करेगा और जो प्रदर्शित होता है।
यदि हम utf8
मॉड्यूल में जोड़ते हैं, तो चीजें अलग होती हैं। इस मामले में, पर्ल आपके स्ट्रिंग की व्याख्या सिर्फ दो पात्रों के रूप में करता है।
$ perl -Mutf8 -E 'say join ":", map { ord } split //, "鸡\n";'
40481:10
डिफ़ॉल्ट रूप से, पर्ल की IO परत मानती है कि यह एकल-बाइट वर्णों के साथ काम कर रही है। इसलिए जब आप एक बहु-बाइट चरित्र को मुद्रित करने का प्रयास करते हैं, तो पर्ल सोचता है कि कुछ गलत है और आपको चेतावनी देता है। हमेशा की तरह, आप इस त्रुटि के लिए अधिक स्पष्टीकरण प्राप्त कर सकते हैं use diagnostics
। यह कहेगा:
(एस utf8) पर्ल एक विस्तृत चरित्र (> 255) से मिला, जब वह उम्मीद नहीं कर रहा था। यह चेतावनी I / O (जैसे प्रिंट) के लिए डिफ़ॉल्ट रूप से है। इस चेतावनी को शांत करने का सबसे आसान तरीका है: आउटपुट में utf8 लेयर जोड़ना, जैसे कि बिनमोड STDOUT, ': utf8'। चेतावनी को बंद करने का एक और तरीका है कि कोई चेतावनी 'utf8' न जोड़ें; लेकिन वह अक्सर धोखा देने के करीब होता है। सामान्य तौर पर, आप एक एन्कोडिंग के साथ फाइलहैंडल को स्पष्ट रूप से चिह्नित करने वाले हैं, खुले और लंबवत / बिनमोड देखें।
जैसा कि दूसरों ने बताया है कि आपको पर्ल को मल्टी-बाइट आउटपुट स्वीकार करने की आवश्यकता है। ऐसा करने के कई तरीके हैं ( कुछ उदाहरणों के लिए पर्ल यूनिकोड ट्यूटोरियल देखें )। सबसे सरल तरीकों में से एक -CS
कमांड लाइन ध्वज का उपयोग करना है - जो यूटीएफ 8 से निपटने के लिए तीन मानक फ़ाइलहैंडल (एसटीडीआईएन, एसटीडीयूएसटी और एसटीडीआरआर) बताता है।
$ perl -Mutf8 -e 'print "鸡\n";'
Wide character in print at -e line 1.
鸡
बनाम
$ perl -Mutf8 -CS -e 'print "鸡\n";'
鸡
यूनिकोड एक बड़ा और जटिल क्षेत्र है। जैसा कि आपने देखा है, कई सरल कार्यक्रम सही काम करते दिखाई देते हैं, लेकिन गलत कारणों से। जब आप कार्यक्रम का हिस्सा ठीक करना शुरू करते हैं, तो जब तक आप सभी कार्यक्रम तय नहीं कर लेते, तब तक चीजें अक्सर खराब हो जाएंगी ।