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


395

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

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

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




4
@ जॉन: यह एक बहुत अच्छा परिचय है, लेकिन यह अंतिम स्रोत नहीं है: यह विवरण के कुछ अंशों को छोड़ देता है (जो अवलोकन / परिचय के लिए ठीक है!)
जोकिम सॉयर

5
लेख बहुत अच्छा है, लेकिन इसमें कई गलतियां हैं और कुछ हद तक रूढ़िवादी प्रकाश में UTF-8 का प्रतिनिधित्व करता है। मैं एक पूरक के रूप में utf8everywhere.org पढ़ने का सुझाव देता हूं।
पावेल रेड्ज़विलोवस्की

2
इस वेबसाइट पर एक नज़र डालें: utf8everywhere.org
वेरटेक्वाहन

जवाबों:


550

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

शुरुआती दिनों में भी (नहीं), सभी मौजूद था 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 बाइट्स से कहीं भी आवश्यकता होती है। यह इंगित करने के लिए इन बाइट्स में से प्रत्येक में कुछ बिट्स को जलाकर किया जाता है ताकि यह बहु-बाइट चरित्र का हिस्सा हो। विशेष रूप से, प्रत्येक बाइट का पहला बिट 1ASCII वर्णों के साथ टकराव से बचने के लिए है।
  • 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 समान दिखते हैं, लेकिन वे क्रमशः लैटिन, सिरिलिक और ग्रीक हैं। आपके पास सी और Ⅽ जैसे मामले भी हैं, एक एक अक्षर है, दूसरा रोमन अंक है। इसके अतिरिक्त, हमारे पास संयोजन पात्रों के साथ-साथ विचार करने के लिए भी है। अधिक जानकारी के लिए यूनिकोड में डुप्लिकेट वर्ण देखें ।

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

अन्य?:


11
उत्कृष्ट उत्तर, इनाम के लिए महान संभावना ;-) व्यक्तिगत रूप से मैं यूटीएफ -8 के लिए कुछ तर्क सार्वभौमिक चरित्र एन्कोडिंग के रूप में जोड़ूंगा , लेकिन मुझे पता है कि यह एक राय है जो जरूरी नहीं कि हर किसी द्वारा साझा की गई हो।
जोकिम सॉयर

3
अभी भी इस स्तर पर मेरे लिए तकनीकी। UTF-8 और UTF-16 में कंप्यूटर में हैलो शब्द कैसे संग्रहीत किया जाता है?
फर्स्टनाम लास्टनाम

1
क्या आप अधिक विस्तार कर सकते हैं, उदाहरण के लिए, BMP UTF-8 में 3 बाइट्स लेता है? मैंने सोचा होगा कि चूँकि इसका अधिकतम मूल्य 0xFFFF (16 बिट्स) है तो इसे एक्सेस करने में केवल 2 बाइट्स लगेंगे।
चिह्नित करें

2
@ चिह्न कुछ बिट्स एन्कोडिंग उद्देश्यों के लिए आरक्षित हैं। UTF-8 में 2 बाइट्स लेने वाले कोड बिंदु के लिए, 5 आरक्षित बिट्स हैं, एक कोड बिंदु का चयन करने के लिए केवल 11 बिट्स को छोड़कर। U + 07FF 2 बाइट्स में उच्चतम कोड पॉइंट प्रतिनिधित्व योग्य होने के साथ समाप्त होता है।
DPenner1

1
BTW - ASCII केवल 128 बिट्स को परिभाषित करता है, प्रतिनिधित्व के लिए केवल 7 बिट्स का उपयोग करता है। यह ISO-8859-1 / ISO-8859-15 है जो 256 कोड बिंदुओं को परिभाषित करता है और प्रतिनिधित्व के लिए 8 बिट्स का उपयोग करता है। इन सभी 3 में पहले 128 कोड पॉइंट समान हैं।
21

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

1
लघु और सटीक
अरित्र चटर्जी

30

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

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

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

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

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

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

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

वर्ण:
forms कोड बिंदु: U + 03C0
एन्कोडिंग फ़ॉर्म (कोड इकाइयाँ):
      UTF-8: CF 80
      UTF-16: 03C0
एन्कोडिंग योजनाएँ (बाइट्स):
      UTF-8: CF 80
      UTF-16BE: 03 CBA
      UTF-16LE: C0 03

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


19

मूल रूप से, यूनिकोड का इरादा एक निश्चित-चौड़ाई 16-बिट एन्कोडिंग (UCS-2) था। जावा और विंडोज NT की तरह, यूनिकोड के शुरुआती अपनाने वालों ने 16-बिट स्ट्रिंग्स के आसपास अपने पुस्तकालयों का निर्माण किया।

बाद में, ऐतिहासिक पात्रों को शामिल करने के लिए यूनिकोड के दायरे का विस्तार किया गया, जिसके लिए 65,536 से अधिक कोड बिंदुओं की आवश्यकता होगी जो 16-बिट एन्कोडिंग का समर्थन करेगा। UCS-2 का उपयोग करने वाले प्लेटफार्मों पर अतिरिक्त वर्णों का प्रतिनिधित्व करने के लिए, UTF-16 एन्कोडिंग की शुरुआत की गई थी। यह पूरक विमानों में पात्रों का प्रतिनिधित्व करने के लिए "सरोगेट जोड़े" का उपयोग करता है।

इस बीच, बहुत सारे पुराने सॉफ्टवेयर और नेटवर्क प्रोटोकॉल 8-बिट स्ट्रिंग्स का उपयोग कर रहे थे। यूटीएफ -8 बनाया गया था ताकि ये सिस्टम व्यापक पात्रों का उपयोग किए बिना यूनिकोड का समर्थन कर सकें। यह 7-बिट ASCII के साथ पीछे की ओर संगत है।


3
यह ध्यान देने योग्य है कि माइक्रोसॉफ्ट अभी भी यूटीएफ -16 को यूनिकोड के रूप में संदर्भित करता है, भ्रम को जोड़ता है। दोनों एक जैसे नहीं हैं ।
मार्क रैनसम

15

यह लेख सभी विवरणों की व्याख्या करता है http://kunststube.net/encoding/

खरीदने वाला

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

00000000 11100011 10000001 10000010

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

00000000 00000000 00110000 01000010

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

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

खरीददार से

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

जैसे आप इस डिकोड हैं: 00000000 11100011 10000001 10000010 UTF16 एन्कोडिंग में, आप के साथ खत्म हो जाएगा नहीं

नोट: एनकोडिंग और यूनिकोड दो अलग-अलग चीजें हैं। यूनिकोड एक अद्वितीय कोड बिंदु पर मैप किए गए प्रत्येक प्रतीक के साथ बड़ा (तालिका) है । उदाहरण के लिए प्रतीक (अक्षर) में एक (कोड बिंदु) है : 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.

यहां छवि विवरण दर्ज करें


11

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

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

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

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

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


9

यूनिकोड क्यों? क्योंकि ASCII में सिर्फ 127 अक्षर हैं। विभिन्न देशों में 128 से 255 तक के लोग अलग-अलग हैं, यही कारण है कि कोडपेज हैं। इसलिए उन्होंने कहा कि 1114111 वर्णों तक के अक्षर हैं। तो आप सबसे अधिक कोडपॉइंट कैसे स्टोर करते हैं? आपको 21 बिट्स का उपयोग करके इसे स्टोर करने की आवश्यकता होगी, इसलिए आप एक DWORD का उपयोग करेंगे जिसमें 11 बिट्स बर्बाद होने के साथ 32 बिट्स होंगे। इसलिए यदि आप एक यूनिकोड वर्ण को संग्रहीत करने के लिए एक DWORD का उपयोग करते हैं, तो यह सबसे आसान तरीका है क्योंकि आपके DWORD में मान बिल्कुल कोडपॉइंट से मेल खाता है। लेकिन DWORD सरणियाँ बेशक WORD सरणियों से बड़ी हैं और निश्चित रूप से BYTE सरणियों से भी बड़ी हैं। इसलिए केवल utf-32 ही नहीं, बल्कि utf-16 भी है। लेकिन utf-16 का अर्थ एक WORD स्ट्रीम है, और एक WORD में 16 बिट्स हैं ताकि उच्चतम कोडपॉइंट 1114111 एक WORD में कैसे फिट हो सके? यह नहीं कर सकते! इसलिए वे 65535 से अधिक आयु वाले हर व्यक्ति को एक DWORD में रखते हैं जिसे वे सरोगेट-जोड़ी कहते हैं। इस तरह के सरोगेट-जोड़ी दो कार्य हैं और पहले 6 बिट्स को देखकर पता लगाया जा सकता है। तो utf-8 के बारे में क्या? यह एक बाइट सरणी या बाइट स्ट्रीम है, लेकिन उच्चतम कोडपॉइंट 1114111 बाइट में कैसे फिट हो सकता है? यह नहीं कर सकते! ठीक है, तो वे भी एक DWORD सही में डाल दिया? या संभवतः एक शब्द, सही? लगभग सही! उन्होंने utf-8 क्रम का आविष्कार किया जिसका अर्थ है कि 127 से अधिक प्रत्येक कोडपॉइंट को 2-बाइट, 3-बाइट या 4-बाइट अनुक्रम में एन्कोड किया जाना चाहिए। वाह! लेकिन हम ऐसे दृश्यों का पता कैसे लगा सकते हैं? खैर, 127 तक सब कुछ ASCII है और एक एकल बाइट है। 110 के साथ जो शुरू होता है वह दो-बाइट क्रम से होता है, जो 1110 से शुरू होता है वह तीन-बाइट क्रम से होता है और जो 11110 से शुरू होता है वह चार-बाइट क्रम से होता है। तथाकथित "स्टार्टबाइट्स" के शेष बिट्स कोडपॉइंट के हैं। अब अनुक्रम के आधार पर, बाइट्स का पालन करना चाहिए। निम्नलिखित बाइट 10 से शुरू होती है, शेष बिट्स पेलोड बिट्स के 6 बिट्स हैं और कोडपॉइंट के हैं। प्रारंभ और निम्नलिखित बाइट के पेलोड बिट्स को समेटें और आपके पास कोडपॉइंट होगा। यह सब utf-8 का जादू है।


3
utf-8 उदाहरण € (यूरो) के संकेत utf-8 3-बाइट अनुक्रम में डिकोड किया गया: E2 = 11100010 82 = 10000010 AC = 10101100 जैसा कि आप देख सकते हैं, E2 1110 से शुरू होता है इसलिए यह तीन-तीन बाइट अनुक्रम है जैसा कि आप देख सकते हैं , 82 और साथ ही एसी 10 से शुरू होता है इसलिए ये बाइट्स का अनुसरण कर रहे हैं। अब हम "पेलोड बिट्स" को बदलते हैं: 0010 + 000010 + 101100 = 10000010101100 जो कि दशमलव 8364 है इसलिए 8364 € (यूरो) साइन के लिए कोडपॉइंट होना चाहिए।
चमकदार

5

ASCII - सॉफ़्टवेयर किसी दिए गए वर्ण के लिए स्मृति में केवल 8 बिट बाइट आवंटित करता है। यह अंग्रेजी के लिए अच्छी तरह से काम करता है और अपनाया (लोन पासवर्ड की तरह) उनके समान दशमलव मान दशमलव मान में 128 से नीचे आता है। उदाहरण सी कार्यक्रम।

UTF-8 - सॉफ़्टवेयर किसी दिए गए वर्ण के लिए 1 से 4 चर 8 बिट बाइट आवंटित करता है। यहाँ चर से क्या मतलब है? मान लें कि आप ब्राउज़र में अपने HTML पृष्ठों के माध्यम से चरित्र 'A' भेज रहे हैं (HTML UTF-8 है), A का संबंधित दशमलव मान 65 है, जब आप इसे दशमलव में परिवर्तित करते हैं तो यह 01000010 हो जाता है। इसके लिए केवल 1 बाइट की आवश्यकता होती है , 1 बाइट मेमोरी को विशेष रूप से अपनाया गया अंग्रेजी वर्णों के लिए भी आवंटित किया जाता है जैसे कि एक शब्द में ç ç। हालाँकि, जब आप यूरोपीय वर्णों को संग्रहीत करना चाहते हैं, तो इसके लिए 2 बाइट्स की आवश्यकता होती है, इसलिए आपको UTF-8 की आवश्यकता होती है। हालाँकि, जब आप एशियाई पात्रों के लिए जाते हैं, तो आपको न्यूनतम 2 बाइट्स और अधिकतम 4 बाइट्स की आवश्यकता होती है। इसी तरह, इमोजी की 3 से 4 बाइट्स की आवश्यकता होती है। UTF-8 आपकी सभी जरूरतों को हल करेगा।

UTF-16 न्यूनतम 2 बाइट्स और अधिकतम 4 बाइट्स प्रति वर्ण आवंटित करेगा, यह 1 या 3 बाइट्स आवंटित नहीं करेगा। प्रत्येक चरित्र या तो 16 बिट या 32 बिट में दर्शाया गया है।

फिर यूटीएफ -16 क्यों है? मूल रूप से, यूनिकोड 16 बिट 8 बिट नहीं था। जावा ने UTF-16 के मूल संस्करण को अपनाया।

संक्षेप में, आपको कहीं भी यूटीएफ -16 की आवश्यकता नहीं है जब तक कि वह पहले से ही उस भाषा या मंच द्वारा नहीं अपनाया गया है जिस पर आप काम कर रहे हैं।

वेब ब्राउजर्स द्वारा इनवॉइस किया गया जावा प्रोग्राम यूटीएफ -16 का उपयोग करता है लेकिन वेब ब्राउजर यूटीएफ -8 का उपयोग करके वर्ण भेजता है।


"आपको कहीं भी UTF-16 की आवश्यकता नहीं है जब तक कि इसे पहले से ही भाषा या मंच द्वारा अपनाया नहीं गया है": यह एक अच्छा बिंदु है लेकिन यहां एक गैर-समावेशी सूची है: जावास्क्रिप्ट, जावा, .NET, SQL NCHAR, SQL NVARCHAR , VB4, VB5, VB6, VBA, VBScript, NTFS, विंडोज एपीआई…।
टॉम ब्लोडेट

2

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.