UTF-8 "चर-चौड़ाई एन्कोडिंग" कैसे काम करता है?


110

यूनिकोड मानक में पर्याप्त कोड-बिंदु होते हैं, जो आपको उन सभी को संग्रहीत करने के लिए 4 बाइट्स की आवश्यकता होती है। यही UTF-32 एन्कोडिंग करता है। फिर भी UTF-8 एन्कोडिंग किसी भी तरह से "चर-चौड़ाई एन्कोडिंग" नामक कुछ का उपयोग करके इन्हें बहुत छोटे स्थानों में निचोड़ देता है।

वास्तव में, यह केवल एक बाइट में यूएस-एएससीआईआई के पहले 127 पात्रों का प्रतिनिधित्व करने का प्रबंधन करता है जो बिल्कुल वास्तविक एएससीआईआई की तरह दिखता है, इसलिए आप बहुत से एससीआई पाठ की व्याख्या कर सकते हैं जैसे कि यह यूटीएफ -8 इसके बिना कुछ भी नहीं कर सकता है। साफ़ - सुथरा तरीका। तो यह कैसे काम करता है?

मैं यहाँ अपना प्रश्न पूछने और उत्तर देने जा रहा हूँ क्योंकि मैंने इसे जानने के लिए थोड़ा-सा पढ़ने का काम किया और मुझे लगा कि यह किसी और को कुछ समय बचा सकता है। इसके अलावा, अगर मुझे इसमें से कुछ गलत मिला है तो कोई मुझे सही कर सकता है।


8
स्ट्रेट यूनिकोड को अपने सभी कोड पॉइंट्स को एनकोड करने के लिए 32 बिट्स की आवश्यकता नहीं होती है। उन्होंने एक बार कई संभावित कोड बिंदुओं पर दावा किया था, लेकिन UTF-8 के हटने के बाद, उन्होंने जानबूझकर खुद को 21 बिट तक सीमित कर लिया, ताकि UTF-8 कभी भी प्रति वर्ण 4 बाइट्स से अधिक न हो। यूनिकोड को वर्तमान में सभी संभावित कोड बिंदुओं को रखने के लिए केवल 17 बिट्स की आवश्यकता है। इस सीमा के बिना, UTF-8 प्रति चरित्र 6 बाइट्स तक जा सकता था।
वॉरेन यंग

@Warren: ज्यादातर सटीक, लेकिन यूनिकोड 21-बिट कोड (U + 0000 से U + 10FFFF) है।
जोनाथन लेफलर

2
@Warren: 4-बाइट-सीमित UTF-8 U + 1FFFFF तक का समर्थन कर सकता था। U + 10FFFF के लिए प्रतिबंध UTF-16 के लिए बनाया गया था।
dan04

@ dan04 क्या हमारे पास कोई आसान स्पष्टीकरण है कि यह UTF-16 द्वारा U + 10FFFF तक कैसे सीमित है? इस बारे में अधिक जानना अच्छा होगा।
ए-लेटबी

@ ए-लेबुबी: क्योंकि यूटीएफ -16 "सरोगेट" कोड ऐसे आवंटित किए गए हैं कि 1024 लीड सरोगेट और 1024 ट्रेल सरोगेट हैं (और वे केवल जोड़े में इस्तेमाल किए जा सकते हैं), 2 ^ 20 (लगभग एक मिलियन) अतिरिक्त वर्ण बनाने के लिए। बीएमपी से परे उपलब्ध है। BMP में उपलब्ध 2 ^ 16 वर्णों में जोड़ा गया, यह 0x110000 संभावित वर्ण बनाता है।
dan04

जवाबों:


129

प्रत्येक बाइट कुछ बिट्स के साथ शुरू होती है जो आपको बताती है कि क्या यह एक सिंगल बाइट कोड-पॉइंट, मल्टी-बाइट कोड पॉइंट या मल्टी-बाइट कोड पॉइंट की निरंतरता है। ऐशे ही:

0xxx xxxx    A single-byte US-ASCII code (from the first 127 characters)

मल्टी-बाइट कोड-पॉइंट्स प्रत्येक कुछ बिट्स के साथ शुरू होते हैं जो अनिवार्य रूप से कहते हैं "हे, आपको यह जानने के लिए कि मैं क्या हूं, यह जानने के लिए अगले बाइट (या दो, या तीन) को भी पढ़ने की आवश्यकता है।" वो हैं:

110x xxxx    One more byte follows
1110 xxxx    Two more bytes follow
1111 0xxx    Three more bytes follow

अंत में, उन बाइट्स का अनुसरण करने वाले बाइट्स सभी इस तरह दिखते हैं:

10xx xxxx    A continuation of one of the multi-byte characters

चूंकि आप बता सकते हैं कि आप पहले कुछ बिट्स से किस तरह की बाइट देख रहे हैं, तब भी अगर कहीं कुछ गड़बड़ हो जाती है, तो आप पूरे अनुक्रम को नहीं खोते हैं।


14
कहानी की तुलना में अधिक है - क्योंकि एन्कोडिंग को चरित्र के लिए सबसे कम संभव एन्कोडिंग होना चाहिए, जिसका अर्थ है कि बाइट्स 0xC0 और 0xC1 UTF-8 में दिखाई नहीं दे सकते हैं, उदाहरण के लिए; और, वास्तव में, न तो 0xF5..0xFF हो सकता है। UTF-8 FAQ को unicode.org/faq/utf_bom.html , या unicode.org/versions/Unicode5.2.0/ch03.pdf पर देखें
जोनाथन लेफ़लर

2
यह कहने के लिए सिर्फ एक चार का उपयोग क्यों नहीं किया जा सकता है next char is continuation? अगर हमें 3 बाइट कैरेक्टर मिलते हैं तो यह इस तरह होगा: 1xxxxxxx 1xxxxxxx 0xxxxxxxइसलिए कम जगह बर्बाद होगी।

9
@Soaku यह UTF-8 को एक तथाकथित "सेल्फ-सिंक्रोनाइज़िंग" कोड बनाता है। इसका मतलब है कि यदि त्रुटियों के कारण अनुक्रम के कुछ भाग गायब हैं, तो यह पता लगाना संभव है कि जो कुछ भी मिला है उसे छोड़ दें। यदि आप एक बाइट को पढ़ते हैं जो 10xx से शुरू होता है, और कोई पूर्ववर्ती "प्रारंभ" बाइट नहीं है, तो आप इसे निरस्त कर सकते हैं क्योंकि यह अर्थहीन है। यदि आपके पास आपके द्वारा वर्णित प्रणाली की तरह है, और पहले बाइट्स में से एक खो गया है, तो आप किसी भी तरह की त्रुटि के संकेत के साथ एक अलग, वैध चरित्र के साथ समाप्त हो सकते हैं। यह अगले वैध चरित्र का पता लगाने में आसान होगा, साथ ही साथ "निरंतरता" बाइट्स को याद रखने के लिए सही होगा।
htmlcoderexe

9

RFC3629 - UTF-8, ISO 10646 का एक रूपांतरण प्रारूप यहां अंतिम प्राधिकरण है और इसमें सभी स्पष्टीकरण हैं।

संक्षेप में, UTF-8-एन्कोडेड 1 से 4-बाइट अनुक्रम के प्रत्येक बाइट में एक बिट का प्रतिनिधित्व करने वाले कई बिट्स का उपयोग यह इंगित करने के लिए किया जाता है कि क्या यह एक अनुगामी बाइट, एक प्रमुख बाइट है, और यदि हां, तो कितने बाइट्स का पालन करें। शेष बिट्स में पेलोड होता है।


1
उम्म, मुझे मूर्खतापूर्ण, मुझे लगा कि यूनिकोड मानक यूटीएफ -8 पर अंतिम अधिकार था
जॉन मैकिन

6
यूनिकोड मानक ही यूनिकोड को परिभाषित करता है। यह विभिन्न तरीकों, आज और भविष्य को परिभाषित नहीं करता है, जिसका उपयोग विभिन्न उद्देश्यों (जैसे भंडारण और परिवहन) के लिए यूनिकोड ग्रंथों को एनकोड करने के लिए किया जा सकता है। UTF-8 उन तरीकों में से एक है और उपरोक्त संदर्भ उस दस्तावेज़ को है जो इसे परिभाषित करता है।
अघेग्लोव

1
RFC3629, पृष्ठ 3, अनुभाग 3 "यूटीएफ -8 यूनिकोड मानक द्वारा परिभाषित किया गया है" कहता है।
जॉन मैकिन

Unicode.org पर लिंक का पीछा करना मुझे यूनिकोड मानक के खंड 3.9 में ले गया और विशेष रूप से D92 की परिभाषा (और यह भी tangentially86)। मुझे कोई अंदाजा नहीं है कि नए संस्करण जारी होने पर यह लिंक किस हद तक उपयोगी होगा, लेकिन मुझे लगता है कि वे खंड और परिभाषा पहचानकर्ताओं को संस्करणों में स्थिर रखना चाहते हैं।
ट्रिपल

4

यूटीएफ -8 यूनिकोड कोड पॉइंट्स के उन तारों को संग्रहीत करने के लिए एक और सिस्टम था, जो कि मैजिक यू + नंबर, 8 बिट बाइट्स का उपयोग करके मेमोरी में होता है। UTF-8 में, 0-127 से प्रत्येक कोड बिंदु एकल बाइट में संग्रहीत किया जाता है। केवल कोड अंक 128 और इसके बाद के संस्करण को 2, 3 का उपयोग करके संग्रहीत किया जाता है, वास्तव में, 6 बाइट्स तक।

से अंश निरपेक्ष न्यूनतम हर सॉफ्टवेयर डेवलपर , सकारात्मक यूनिकोड और चरित्र सेट (Nouse!) के बारे में पता होना चाहिए


यह एक अच्छा लेख है, लेकिन ऐसा लगता है कि जोएल अनुक्रम की अधिकतम लंबाई के बारे में गलत है; विकिपीडिया पृष्ठ केवल प्रति वर्ण 1..4 बाइट दिखाता है।
खोलना

4
जैसा कि मैंने ऊपर कहा, जब यूटीएफ -8 पहली बार बनाया गया था, तो यूनिकोड ने कोड बिंदुओं के लिए 32-बिट तक का दावा किया था, इसलिए नहीं कि उन्हें वास्तव में इसकी आवश्यकता थी, केवल इसलिए कि 32-बिट एक सुविधाजनक मूल्य है और वे पहले से ही उड़ा चुके हैं 16-बिट वर्णों की पिछली सीमा। UTF-8 लोकप्रिय साबित होने के बाद, उन्होंने हमेशा के लिए कोड अंक की अधिकतम संख्या को 2 ^ 21 तक सीमित करने का विकल्प चुना, जो कि सबसे बड़ा मूल्य होने के नाते आप UTF-8 योजना के 4 बाइट्स के साथ सांकेतिक शब्दों में बदल सकते हैं। अभी भी यूनिकोड में 2 ^ 17 से कम वर्ण हैं, इसलिए हम इस नई योजना के साथ यूनिकोड में वर्णों की संख्या को चौगुना कर सकते हैं।
वॉरेन यंग

ठीक है, लेकिन ओपी द्वारा पूछा गया स्पष्टीकरण नहीं।
निशांत

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