unicode - यूनिकोड, यूटीएफ-8, यूटीएफ-16 क्या है?




encoding utf-8 (6)

यूनिकोड के लिए आधार क्या है और यूटीएफ -8 या यूटीएफ -16 की आवश्यकता क्यों है? मैंने Google पर इसका शोध किया है और यहां भी खोजा है लेकिन यह मुझे स्पष्ट नहीं है।

वीएसएस में फ़ाइल तुलना करते समय, कभी-कभी एक संदेश होता है कि दो फाइलें यूटीएफ के अलग-अलग हैं। यह मामला क्यों होगा?

कृपया सरल शब्दों में बताएं।


यूनिकोड एक काफी जटिल मानक है। बहुत डरो मत, लेकिन कुछ काम के लिए तैयार रहो! [2]

चूंकि एक विश्वसनीय संसाधन की हमेशा आवश्यकता होती है, लेकिन आधिकारिक रिपोर्ट भारी है, मैं निम्नलिखित को पढ़ने का सुझाव देता हूं:

  1. निरपेक्ष न्यूनतम सॉफ्टवेयर डेवलपर बिल्कुल, यूनिकोड और कैरेक्टर सेट्स के बारे में सकारात्मक रूप से जानना चाहिए (कोई बहाना नहीं!) जोएल स्पॉस्की, स्टैक एक्सचेंज सीईओ द्वारा एक परिचय।
  2. बीएमपी और उससे परे! यूनिकोड कंसोर्टियम में बाद में उपराष्ट्रपति एरिक मुलर, तकनीकी निदेशक द्वारा एक ट्यूटोरियल। (पहली 20 स्लाइड और आप कर रहे हैं)

एक संक्षिप्त स्पष्टीकरण:

कंप्यूटर बाइट्स पढ़ते हैं और लोग अक्षर पढ़ते हैं, इसलिए हम बाइट्स को वर्णों को मैप करने के लिए एन्कोडिंग मानकों का उपयोग करते हैं। एएससीआईआईआई पहले व्यापक रूप से इस्तेमाल किए जाने वाले मानक थे, लेकिन केवल लैटिन (7 बिट्स / चरित्र 128 अलग-अलग वर्णों का प्रतिनिधित्व कर सकते हैं) को कवर करते हैं। यूनिकोड दुनिया के सभी संभावित पात्रों को कवर करने के लक्ष्य के साथ एक मानक है (21 बिट्स / कैरेक्टर अधिकतम का अर्थ है, वर्तमान में 21,7 बिट्स वर्ण वर्णित कर सकते हैं। वर्तमान यूनिकोड 8.0 कुल में 120,737 वर्ण निर्दिष्ट करता है, और यह सब कुछ है)।

मुख्य अंतर यह है कि एक ASCII चरित्र बाइट (8 बिट्स) के लिए उपयुक्त हो सकता है, लेकिन अधिकांश यूनिकोड वर्ण नहीं कर सकते हैं। इसलिए एन्कोडिंग फॉर्म / स्कीम (जैसे यूटीएफ -8 और यूटीएफ -16) का उपयोग किया जाता है, और चरित्र मॉडल इस प्रकार है:

प्रत्येक चरित्र में 0 से 1,114,111 (हेक्स: 0-10FFFF) से कोड बिंदु कहा जाता है
एक एन्कोडिंग फॉर्म कोड कोड अनुक्रम में कोड बिंदु को मानचित्र करता है। एक कोड इकाई जिस तरह से आप मेमोरी, 8-बिट इकाइयों, 16-बिट इकाइयों और अन्य में वर्णों को व्यवस्थित करना चाहते हैं। यूटीएफ -8 8 बिट्स की 1 से 4 इकाइयों का उपयोग करता है, और यूटीएफ -16 21 बिट्स के पूरे यूनिकोड को कवर करने के लिए 16 बिट्स की 1 या 2 इकाइयों का उपयोग करता है। इकाइयां उपसर्ग का उपयोग करती हैं ताकि चरित्र सीमाओं को देखा जा सके, और अधिक इकाइयों का मतलब अधिक उपसर्ग है जो बिट्स पर कब्जा करते हैं। इसलिए, हालांकि यूटीएफ -8 लैटिन स्क्रिप्ट के लिए 1 बाइट का उपयोग करता है, लेकिन मूल बहुभाषी विमान के अंदर बाद की स्क्रिप्ट के लिए इसे 3 बाइट की आवश्यकता होती है, जबकि यूटीएफ -16 इन सभी के लिए 2 बाइट्स का उपयोग करता है। और यह उनका मुख्य अंतर है।
अंत में, एक एन्कोडिंग योजना (जैसे यूटीएफ -16 बीई या यूटीएफ -16LE) मानचित्र बाइट अनुक्रम के लिए एक कोड इकाई अनुक्रम (serializes)।

चरित्र: π
कोड बिंदु: यू + 03 सी 0
एन्कोडिंग फॉर्म (कोड इकाइयां):
यूटीएफ -8: सीएफ 80
यूटीएफ -16: 03 सी 0
एन्कोडिंग योजनाएं (बाइट्स):
यूटीएफ -8: सीएफ 80
यूटीएफ -16 बीई: 03 सी 0
यूटीएफ -16LE: सी 0 03

युक्ति: एक हेक्स अंक 4 बिट्स का प्रतिनिधित्व करता है, इसलिए दो अंकों वाला हेक्स नंबर बाइट का प्रतिनिधित्व करता है
चरित्र सेट लेआउट की भावना प्राप्त करने के लिए विकिपीडिया में प्लेन मानचित्र पर भी नज़र डालें


हमें यूनिकोड की आवश्यकता क्यों है?

शुरुआती दिनों में (भी नहीं), जो अस्तित्व में था वह ASCII था। यह ठीक था, जैसा कि कभी भी जरूरी था, इस वाक्य में कुछ नियंत्रण वर्ण, विराम चिह्न, संख्याएं और अक्षरों जैसे थे। दुर्भाग्यवश, वैश्विक अंतःक्रिया और सोशल मीडिया की आज की अजीब दुनिया पूर्ववत नहीं थी, और अंग्रेजी, العربية, 汉语, עִבְרִית, ελληνικά, और एक ही दस्तावेज़ में यह देखना बहुत असामान्य नहीं है (मुझे उम्मीद है कि मैंने किसी भी पुराने ब्राउज़र को तोड़ नहीं दिया )।

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

इसलिए, सभी भाषाओं समेत एक समेकित चरित्र सेट की आवश्यकता है। इस प्रकार यूनिकोड आया। यह प्रत्येक चरित्र को कोड बिंदु नामक एक अद्वितीय संख्या निर्दिष्ट करता है। अन्य संभावित सेटों पर यूनिकोड का एक लाभ यह है कि पहले 256 कोड अंक ISO-8859-1 9 ISO-8859-1 समान हैं, और इसलिए ASCII भी हैं। इसके अलावा, सामान्य बहुभाषी प्लेन (बीएमपी) नामक एक क्षेत्र में, आमतौर पर उपयोग किए जाने वाले वर्णों का विशाल बहुमत केवल दो बाइट्स द्वारा दर्शाया जा सकता है। अब इस चरित्र सेट तक पहुंचने के लिए एक वर्ण एन्कोडिंग की आवश्यकता है, और जैसा सवाल पूछता है, मैं यूटीएफ -8 और यूटीएफ -16 पर ध्यान केंद्रित करूंगा।

मेमोरी विचार

तो कितने बाइट इन एन्कोडिंग में कौन से पात्रों तक पहुंच प्रदान करते हैं?

  • UTF-8:
    • 1 बाइट: मानक ASCII
    • 2 बाइट्स: अरबी, हिब्रू, अधिकांश यूरोपीय स्क्रिप्ट (सबसे विशेष रूप से Georgian को छोड़कर)
    • 3 बाइट्स: बीएमपी
    • 4 बाइट्स: सभी यूनिकोड वर्ण
  • UTF-16:
    • 2 बाइट्स: बीएमपी
    • 4 बाइट्स: सभी यूनिकोड वर्ण

अब उल्लेखनीय है कि बीएमपी में वर्णों में प्राचीन स्क्रिप्ट, गणितीय प्रतीकों, संगीत प्रतीकों, और दुर्लभ चीनी / जापानी / कोरियाई (सीजेके) पात्र शामिल नहीं हैं।

यदि आप ज्यादातर ASCII वर्णों के साथ काम करेंगे, तो यूटीएफ -8 निश्चित रूप से अधिक स्मृति कुशल है। हालांकि, यदि आप ज्यादातर गैर-यूरोपीय स्क्रिप्ट के साथ काम कर रहे हैं, तो यूटीएफ -8 का उपयोग यूटीएफ -16 की तुलना में 1.5 गुना कम मेमोरी कुशल हो सकता है। बड़ी मात्रा में टेक्स्ट से निपटने पर, जैसे बड़े वेब पेज या लंबे शब्द दस्तावेज़, यह प्रदर्शन को प्रभावित कर सकता है।

एन्कोडिंग मूल बातें

नोट: यदि आप जानते हैं कि यूटीएफ -8 और यूटीएफ -16 एन्कोड किए गए हैं, तो व्यावहारिक अनुप्रयोगों के लिए अगले खंड पर जाएं।

  • यूटीएफ -8: मानक ASCII (0-127) वर्णों के लिए, यूटीएफ -8 कोड समान हैं। यह यूटीएफ -8 आदर्श बनाता है यदि मौजूदा ASCII पाठ के साथ पिछड़ा संगतता आवश्यक है। अन्य पात्रों को 2-4 बाइट से कहीं भी आवश्यकता होती है। यह इंगित करने के लिए कि यह एक बहु-बाइट चरित्र का हिस्सा है, इन बाइट्स में से प्रत्येक में कुछ बिट्स को आरक्षित करके किया जाता है। विशेष रूप से, ASCII वर्णों के साथ संघर्ष से बचने के लिए प्रत्येक बाइट का पहला भाग 1 है।
  • यूटीएफ -16: वैध बीएमपी पात्रों के लिए, यूटीएफ -16 प्रतिनिधित्व बस इसका कोड बिंदु है। हालांकि, गैर-बीएमपी पात्रों के लिए यूटीएफ -16 सरोगेट जोड़े पेश करता है। इस मामले में दो दो-बाइट भागों का संयोजन एक गैर-बीएमपी चरित्र के लिए मानचित्र है। ये दो बाइट भाग बीएमपी संख्यात्मक सीमा से आते हैं, लेकिन यूनिकोड मानक द्वारा बीएमपी पात्रों के रूप में अमान्य होने की गारंटी दी जाती है। इसके अतिरिक्त, चूंकि यूटीएफ -16 में इसकी मूल इकाई के रूप में दो बाइट हैं, यह endianness से प्रभावित होता है। क्षतिपूर्ति करने के लिए, एक आरक्षित बाइट ऑर्डर मार्क डेटा स्ट्रीम की शुरुआत में रखा जा सकता है जो अंतहीनता को इंगित करता है। इस प्रकार, यदि आप यूटीएफ -16 इनपुट पढ़ रहे हैं, और कोई अंतराल निर्दिष्ट नहीं है, तो आपको इसकी जांच करनी होगी।

जैसा कि देखा जा सकता है, यूटीएफ -8 और यूटीएफ -16 एक दूसरे के साथ संगत नहीं हैं। तो यदि आप I / O कर रहे हैं, तो सुनिश्चित करें कि आप जानते हैं कि आप किस एन्कोडिंग का उपयोग कर रहे हैं! इन एन्कोडिंग पर अधिक जानकारी के लिए, कृपया यूटीएफ अकसर किये गए सवाल देखें।

प्रैक्टिकल प्रोग्रामिंग विचार

चरित्र और स्ट्रिंग डेटा प्रकार: प्रोग्रामिंग भाषा में वे कैसे एन्कोड किए जाते हैं? यदि वे कच्चे बाइट हैं, तो जिस मिनट में आप गैर-ASCII वर्णों को आउटपुट करने का प्रयास करते हैं, तो आप कुछ समस्याओं में भाग ले सकते हैं। इसके अलावा, यहां तक ​​कि यदि चरित्र प्रकार यूटीएफ पर आधारित है, तो इसका मतलब यह नहीं है कि स्ट्रिंग उचित यूटीएफ हैं। वे बाइट अनुक्रमों को अनुमति दे सकते हैं जो अवैध हैं। आम तौर पर, आपको एक लाइब्रेरी का उपयोग करना होगा जो यूटीएफ का समर्थन करता है, जैसे सी, सी ++ और जावा के लिए ICU । किसी भी मामले में, यदि आप डिफ़ॉल्ट एन्कोडिंग के अलावा कुछ इनपुट / आउटपुट करना चाहते हैं, तो आपको इसे पहले कनवर्ट करना होगा।

अनुशंसित / डिफ़ॉल्ट / प्रभावशाली एन्कोडिंग: जब यूटीएफ का उपयोग करने का विकल्प दिया जाता है, तो आमतौर पर आपके द्वारा काम कर रहे पर्यावरण के लिए अनुशंसित मानकों का पालन करना सबसे अच्छा होता है। उदाहरण के लिए, यूटीएफ -8 वेब पर प्रभावशाली है, और एचटीएमएल 5 के बाद से अनुशंसित एन्कोडिंग किया गया है। इसके विपरीत, एक यूटीएफ -16 चरित्र प्रकार पर .NET और Java वातावरण दोनों स्थापित किए गए हैं। उलझन में (और गलत तरीके से), संदर्भ अक्सर "यूनिकोड एन्कोडिंग" में किए जाते हैं, जो आमतौर पर किसी दिए गए वातावरण में प्रमुख यूटीएफ एन्कोडिंग को संदर्भित करता है।

लाइब्रेरी समर्थन: आप जिन पुस्तकालयों का समर्थन कर रहे हैं, वे कौन सी एन्कोडिंग हैं? क्या वे कोने के मामलों का समर्थन करते हैं? चूंकि आवश्यकता आविष्कार की मां है, यूटीएफ -8 पुस्तकालय आमतौर पर 4-बाइट वर्णों का समर्थन करेंगे, क्योंकि 1, 2, और यहां तक ​​कि 3 बाइट वर्ण अक्सर हो सकते हैं। हालांकि, सभी कथित यूटीएफ -16 पुस्तकालयों में सरोगेट जोड़े का उचित समर्थन नहीं होता है क्योंकि वे बहुत ही कम होते हैं।

वर्णों की गणना: यूनिकोड में वर्णों का संयोजन मौजूद है। उदाहरण के लिए कोड प्वाइंट यू +006 ई (एन), और यू +0303 (एक संयोजन टिल्ड) रूपों को बनाते हैं, लेकिन कोड बिंदु यू +00 एफ 1 फॉर्म ñ। उन्हें समान दिखना चाहिए, लेकिन एक साधारण गिनती एल्गोरिदम पहले उदाहरण के लिए 2 लौटाएगा, बाद वाले के लिए 1। यह जरूरी नहीं है, लेकिन वांछित परिणाम भी नहीं हो सकता है।

समानता की तुलना में: ए, ए, और Α समान दिखते हैं, लेकिन वे क्रमशः लैटिन, सिरिलिक और ग्रीक हैं। आपके पास सी और Ⅽ जैसे मामले भी हैं, एक एक पत्र है, दूसरा रोमन अंक है। इसके अलावा, हमारे पास संयोजन करने वाले पात्र भी हैं। अधिक जानकारी के लिए यूनिकोड में डुप्लिकेट वर्ण देखें।

सरोगेट जोड़े: ये अक्सर एसओ पर पर्याप्त आते हैं, इसलिए मैं कुछ उदाहरण लिंक प्रदान करूंगा:

दूसरों ?:


यह आलेख सभी विवरण बताता है http://kunststube.net/encoding/

बफर करने के लिए लिखना

यदि आप 4 बाइट बफर को लिखते हैं, तो यूटीएफ 8 एन्कोडिंग के साथ अक्षर,, आपकी बाइनरी इस तरह दिखेगी:

00000000 11100011 10000001 10000010

यदि आप 4 बाइट बफर को लिखते हैं, तो यूटीएफ 16 एन्कोडिंग के साथ अक्षर,, आपकी बाइनरी इस तरह दिखेगी:

00000000 00000000 00110000 01000010

जैसा कि आप देख सकते हैं, इस बात के आधार पर कि आप अपनी सामग्री में किस भाषा का उपयोग करेंगे, यह तदनुसार आपकी याददाश्त को प्रभावित करेगा।

उदाहरण के लिए इस विशेष पत्र के लिए: यूटीएफ 16 एन्कोडिंग अधिक कुशल है क्योंकि हमारे पास अगले प्रतीक के लिए उपयोग करने के लिए 2 अतिरिक्त बाइट हैं। लेकिन इसका मतलब यह नहीं है कि आपको जापान वर्णमाला के लिए यूटीएफ 16 का उपयोग करना होगा।

बफर से पढ़ना

अब यदि आप उपरोक्त बाइट्स को पढ़ना चाहते हैं, तो आपको यह जानना होगा कि यह किस एन्कोडिंग को लिखा गया था और उसे सही तरीके से डीकोड किया गया था।

उदाहरण के लिए यदि आप इसे डीकोड करते हैं: 00000000 11100011 10000001 10000010 यूटीएफ 16 एन्कोडिंग में, आप नहीं साथ समाप्त हो जाएगा

नोट: एन्कोडिंग और यूनिकोड दो अलग-अलग चीजें हैं। यूनिकोड एक अद्वितीय कोड बिंदु पर मैप किए गए प्रत्येक प्रतीक के साथ बड़ी (table) । उदाहरण के लिए पत्र में एक (कोड बिंदु) है : 30 42 (हेक्स)। दूसरी ओर एन्कोडिंग, एक एल्गोरिदम है जो हार्डवेयर को संग्रहीत करते समय प्रतीकों को अधिक उचित तरीके से परिवर्तित करता है।

30 42 (hex) - > UTF8 encoding - > E3 81 82 (hex), which is above result in binary.

30 42 (hex) - > UTF16 encoding - > 30 42 (hex), which is above result in binary.


यूटीएफ यूनिकोड ट्रांसफॉर्मेशन फॉर्मेट के लिए खड़ा है। मूल रूप से आज की दुनिया में सैकड़ों अन्य भाषाओं में लिखी गई स्क्रिप्ट हैं, प्रारूपों को पहले इस्तेमाल किए गए मूल ASCII द्वारा कवर नहीं किया गया है। इसलिए, यूटीएफ अस्तित्व में आया।

यूटीएफ -8 में चरित्र एन्कोडिंग क्षमताएं हैं और इसकी कोड इकाई 8 बिट्स है जबकि यूटीएफ -16 के लिए यह 16 बिट्स है।


यूनिकोड एक मानक है जो सभी भाषाओं में वर्णों को कोड पॉइंट्स नामक एक विशेष संख्यात्मक मूल्य पर मानचित्रित करता है। इसका कारण यह है क्योंकि, यह कोड अंक के उसी सेट का उपयोग करके अलग-अलग एन्कोडिंग संभव होने की अनुमति देता है।

यूटीएफ -8 और यूटीएफ -16 दो ऐसे एन्कोडिंग हैं। वे कोड पॉइंट इनपुट के रूप में लेते हैं और एन्कोडेड स्ट्रिंग का उत्पादन करने के लिए कुछ अच्छी तरह से परिभाषित सूत्र का उपयोग करके उन्हें एन्कोड करते हैं।

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

यूनिकोड, यूटीएफ -8 और यूटीएफ -16 के बारे में अधिक गहन विवरण के लिए, आप इस आलेख को चेकआउट कर सकते हैं,

यूनिकोड के बारे में प्रत्येक प्रोग्रामर को क्या पता होना चाहिए


  • यूनिकोड
    • दुनिया भर में इस्तेमाल वर्णों का एक सेट है
  • UTF-8
    • यूनिकोड में सभी संभावित वर्णों (कोड पॉइंट्स कहा जाता है) को एन्कोड करने में सक्षम एक वर्ण एन्कोडिंग।
    • कोड इकाई 8-बिट्स है
    • यूनिकोड एन्कोड करने के लिए एक से चार कोड इकाइयों का उपयोग करें
    • 00100100 " $ " (एक 8-बिट्स) के लिए; " ¢ " (दो 8-बिट्स) के लिए 11000010 10100010 ; " " के लिए 11100010 10000010 10101100 (तीन 8-बिट्स)
  • UTF-16
    • एक और चरित्र एन्कोडिंग
    • कोड इकाई 16-बिट्स है
    • यूनिकोड एन्कोड करने के लिए एक से दो कोड इकाइयों का उपयोग करें
    • " $ " (एक 16-बिट्स) के लिए 00000000 00100100 ; " 𤭢 " (दो 16-बिट्स) के लिए 11011000 01010010 11011111 01100010




utf-16