हमें यूनिकोड की आवश्यकता क्यों है?
शुरुआती दिनों में भी (नहीं), सभी मौजूद था ASCII। यह ठीक था, क्योंकि कभी-कभी जरूरत पड़ने पर इस वाक्य में कुछ नियंत्रण वर्ण, विराम चिह्न, संख्या और अक्षर होते थे। दुर्भाग्य से, वैश्विक अंतर-संचार और सोशल मीडिया की आज की विचित्र दुनिया की कल्पना नहीं की गई थी, और अंग्रेजी, العربية, 汉语, עִבְרִית, ηλληνικά, और document को एक ही दस्तावेज़ में देखना असामान्य नहीं है (मुझे आशा है कि मैंने किसी भी पुराने को नहीं तोड़ा है। ब्राउज़र)।
लेकिन तर्क के लिए, जो कहते हैं कि जो औसत एक सॉफ्टवेयर डेवलपर है। वह जोर देकर कहते हैं कि उन्हें केवल अंग्रेजी की आवश्यकता होगी, और जैसे कि केवल ASCII का उपयोग करना चाहते हैं। यह जो उपयोगकर्ता के लिए ठीक हो सकता है , लेकिन सॉफ्टवेयर डेवलपर जो के लिए यह ठीक नहीं है । लगभग आधी दुनिया गैर-लैटिन वर्णों का उपयोग करती है और ASCII का उपयोग यकीनन इन लोगों के लिए असंगत है, और इसके शीर्ष पर, वह एक बड़ी और बढ़ती अर्थव्यवस्था के लिए अपने सॉफ़्टवेयर को बंद कर रहा है।
इसलिए, सभी भाषाओं सहित एक सम्मिलित वर्ण सेट की जरूरत है। इस प्रकार यूनिकोड आया। यह प्रत्येक वर्ण को एक अद्वितीय संख्या प्रदान करता है जिसे एक कोड बिंदु कहा जाता है । अन्य संभावित सेटों पर यूनिकोड का एक फायदा यह है कि पहले 256 कोड पॉइंट ISO-8859-1 के समान हैं , और इसलिए CCII भी। इसके अलावा, आमतौर पर उपयोग किए जाने वाले वर्णों के विशाल बहुमत को मूल बहुभाषी विमान (बीएमपी) नामक क्षेत्र में केवल दो बाइट्स द्वारा दर्शाया जाता है । अब इस कैरेक्टर सेट को एक्सेस करने के लिए एक कैरेक्टर एन्कोडिंग की जरूरत है, और जैसा कि सवाल पूछता है, मैं UTF-8 और UTF-16 पर ध्यान केंद्रित करूंगा।
स्मृति विचार
तो कितने बाइट्स इन एन्कोडिंग में किस वर्ण तक पहुँच देते हैं?
- UTF-8:
- 1 बाइट: मानक ASCII
- 2 बाइट्स: अरबी, हिब्रू, अधिकांश यूरोपीय लिपियाँ (सबसे विशेष रूप से जॉर्जियाई को छोड़कर )
- 3 बाइट्स: बीएमपी
- 4 बाइट्स: सभी यूनिकोड वर्ण
- UTF-16:
- 2 बाइट्स: बीएमपी
- 4 बाइट्स: सभी यूनिकोड वर्ण
यह अब ध्यान देने योग्य है कि BMP में नहीं वर्णों में प्राचीन लिपियाँ, गणितीय प्रतीक, संगीत प्रतीक और दुर्लभ चीनी / जापानी / कोरियाई (CJK) वर्ण शामिल हैं।
यदि आप ज्यादातर ASCII वर्णों के साथ काम कर रहे हैं, तो UTF-8 निश्चित रूप से अधिक स्मृति कुशल है। हालाँकि, यदि आप अधिकतर गैर-यूरोपीय लिपियों के साथ काम कर रहे हैं, तो UTF-8 का उपयोग UTF-16 की तुलना में 1.5 गुना कम मेमोरी कुशल हो सकता है। जब बड़ी मात्रा में पाठ, जैसे कि बड़े वेब-पेज या लंबा शब्द दस्तावेज़ों के साथ काम करते हैं, तो यह प्रदर्शन को प्रभावित कर सकता है।
मूल बातें एन्कोडिंग
नोट: यदि आप जानते हैं कि UTF-8 और UTF-16 कैसे एन्कोड किए गए हैं, तो व्यावहारिक अनुप्रयोगों के लिए अगले अनुभाग पर जाएं।
- UTF-8: मानक ASCII (0-127) वर्णों के लिए, UTF-8 कोड समान हैं। यदि मौजूदा ASCII पाठ के साथ पश्चगामी संगतता आवश्यक है, तो यह UTF-8 को आदर्श बनाता है। अन्य पात्रों को 2-4 बाइट्स से कहीं भी आवश्यकता होती है। यह इंगित करने के लिए इन बाइट्स में से प्रत्येक में कुछ बिट्स को जलाकर किया जाता है ताकि यह बहु-बाइट चरित्र का हिस्सा हो। विशेष रूप से, प्रत्येक बाइट का पहला बिट
1
ASCII वर्णों के साथ टकराव से बचने के लिए है।
- UTF-16: मान्य BMP वर्णों के लिए, UTF-16 प्रतिनिधित्व केवल इसका कोड बिंदु है। हालांकि, गैर-बीएमपी वर्णों के लिए UTF-16 सरोगेट जोड़े का परिचय देता है । इस मामले में एक गैर-बीएमपी चरित्र के लिए दो दो-बाइट भागों के नक्शे का एक संयोजन। ये दो-बाइट अंश बीएमपी संख्यात्मक सीमा से आते हैं, लेकिन यूएमकोड मानक द्वारा बीएमपी वर्णों के रूप में अमान्य होने की गारंटी है। इसके अलावा, चूंकि यूटीएफ -16 की मूल इकाई के रूप में दो बाइट्स हैं, यह एंडियनस से प्रभावित है । क्षतिपूर्ति करने के लिए, एक आरक्षित बाइट ऑर्डर मार्क को एक डेटा स्ट्रीम की शुरुआत में रखा जा सकता है जो एंडियननेस को इंगित करता है। इस प्रकार, यदि आप UTF-16 इनपुट पढ़ रहे हैं, और कोई एंडियननेस निर्दिष्ट नहीं है, तो आपको इसके लिए जांच करनी चाहिए।
जैसा कि देखा जा सकता है, UTF-8 और UTF-16 एक दूसरे के साथ संगत नहीं हैं। इसलिए यदि आप I / O कर रहे हैं, तो सुनिश्चित करें कि आप जानते हैं कि आप किस एन्कोडिंग का उपयोग कर रहे हैं! इन एन्कोडिंग पर अधिक जानकारी के लिए, कृपया UTF FAQ देखें ।
व्यावहारिक प्रोग्रामिंग विचार
चरित्र और स्ट्रिंग डेटा प्रकार: वे प्रोग्रामिंग भाषा में कैसे एन्कोडेड हैं? यदि वे कच्चे बाइट्स हैं, तो जिस मिनट में आप गैर- ASCII वर्णों को आउटपुट करने का प्रयास करते हैं, आप कुछ समस्याओं में भाग सकते हैं। इसके अलावा, भले ही चरित्र प्रकार एक यूटीएफ पर आधारित हो, इसका मतलब यह नहीं है कि तार उचित यूटीएफ हैं। वे बाइट सीक्वेंस की अनुमति दे सकते हैं जो अवैध हैं। आम तौर पर, आपको एक पुस्तकालय का उपयोग करना होगा जो यूटीएफ का समर्थन करता है, जैसे कि सी, सी ++ और जावा के लिए आईसीयू । किसी भी स्थिति में, यदि आप डिफ़ॉल्ट एन्कोडिंग के अलावा कुछ और इनपुट / आउटपुट करना चाहते हैं, तो आपको इसे पहले बदलना होगा।
अनुशंसित / डिफ़ॉल्ट / प्रमुख एन्कोडिंग: जब यूटीएफ का उपयोग करने का एक विकल्प दिया जाता है, तो आमतौर पर आपके द्वारा काम किए जाने वाले वातावरण के लिए अनुशंसित मानकों का पालन करना सबसे अच्छा होता है। उदाहरण के लिए, यूटीएफ -8 वेब पर प्रमुख है, और एचटीएमएल 5 के बाद से, अनुशंसित एन्कोडिंग किया गया है । इसके विपरीत, .NET और Java वातावरण दोनों की स्थापना UTF-16 वर्ण प्रकार पर की जाती है। भ्रामक (और गलत तरीके से), संदर्भ अक्सर "यूनिकोड एन्कोडिंग" से बने होते हैं, जो आमतौर पर किसी दिए गए वातावरण में प्रमुख यूटीएफ एन्कोडिंग को संदर्भित करता है।
लाइब्रेरी सपोर्ट: आप जिन लाइब्रेरीज़ का इस्तेमाल कर रहे हैं, वे किसी तरह की एन्कोडिंग का सहारा ले रही हैं। कौनसा? क्या वे कोने के मामलों का समर्थन करते हैं? चूँकि आवश्यकता आविष्कार की जननी है, यूटीएफ -8 पुस्तकालय आमतौर पर 4-बाइट वर्णों का समर्थन करेंगे, चूंकि 1, 2, और यहां तक कि 3 बाइट वर्ण अक्सर हो सकते हैं। हालांकि, सभी पुरस्कृत UTF-16 पुस्तकालय सरोगेट जोड़े का ठीक से समर्थन नहीं करते हैं क्योंकि वे बहुत कम ही होते हैं।
गिनती के वर्ण: यूनिकोड में वर्णों का संयोजन मौजूद है । उदाहरण के लिए कोड बिंदु U + 006E (n), और U + 0303 (एक संयोजन टिल्ड) ñ बनता है, लेकिन कोड बिंदु U + 00F1 रूपों ñ। उन्हें समान दिखना चाहिए, लेकिन एक साधारण गणना एल्गोरिथ्म पहले उदाहरण के लिए 2, बाद के लिए 1 लौटेगा। यह गलत नहीं है, लेकिन वांछित परिणाम नहीं भी हो सकता है।
समानता के लिए तुलना: A, А, और same समान दिखते हैं, लेकिन वे क्रमशः लैटिन, सिरिलिक और ग्रीक हैं। आपके पास सी और Ⅽ जैसे मामले भी हैं, एक एक अक्षर है, दूसरा रोमन अंक है। इसके अतिरिक्त, हमारे पास संयोजन पात्रों के साथ-साथ विचार करने के लिए भी है। अधिक जानकारी के लिए यूनिकोड में डुप्लिकेट वर्ण देखें ।
सरोगेट जोड़े: ये एसओ पर अक्सर पर्याप्त आते हैं, इसलिए मैं सिर्फ कुछ उदाहरण लिंक प्रदान करूंगा:
अन्य?: