यदि UTF-8 8 बिट्स है, तो क्या इसका मतलब यह नहीं है कि अधिकतम 256 विभिन्न वर्ण हो सकते हैं?
पहले 128 कोड पॉइंट ASCII की तरह ही हैं। लेकिन यह कहता है कि UTF-8 लाखों पात्रों तक का समर्थन कर सकता है?
यह कैसे काम करता है?
यदि UTF-8 8 बिट्स है, तो क्या इसका मतलब यह नहीं है कि अधिकतम 256 विभिन्न वर्ण हो सकते हैं?
पहले 128 कोड पॉइंट ASCII की तरह ही हैं। लेकिन यह कहता है कि UTF-8 लाखों पात्रों तक का समर्थन कर सकता है?
यह कैसे काम करता है?
जवाबों:
UTF-8 हर समय एक बाइट का उपयोग नहीं करता है, यह 1 से 4 बाइट्स है।
पहले 128 अक्षरों (US-ASCII) को एक बाइट की आवश्यकता होती है।
अगले 1,920 वर्णों को एनकोड करने के लिए दो बाइट्स की आवश्यकता होती है। यह लगभग सभी लैटिन वर्णमालाओं के शेष भाग को कवर करता है, और ग्रीक, सिरिलिक, कॉप्टिक, आर्मीनियाई, हिब्रू, अरबी, सिरियाक और टाना वर्णमाला के साथ-साथ डियाक्रिटिकल मार्क्स को भी जोड़ता है।
बेसिक बहुभाषी विमान के बाकी हिस्सों में पात्रों के लिए तीन बाइट्स की आवश्यकता होती है, जिसमें लगभग सभी वर्णों का उपयोग होता है [12] जिसमें अधिकांश चीनी, जापानी और कोरियाई [CJK] वर्ण शामिल हैं।
यूनिकोड के अन्य विमानों में पात्रों के लिए चार बाइट्स की आवश्यकता होती है, जिसमें कम सामान्य सीजेके वर्ण, विभिन्न ऐतिहासिक लिपियाँ, गणितीय प्रतीक और इमोजी (चित्रात्मक प्रतीक) शामिल हैं।
स्रोत: विकिपीडिया
UTF-8 प्रति वर्ण 1-4 बाइट्स का उपयोग करता है: एससीआई वर्णों के लिए एक बाइट (पहले 128 यूनिकोड मान एससीआई के समान हैं)। लेकिन इसके लिए केवल 7 बिट्स की आवश्यकता होती है। यदि उच्चतम ("साइन") बिट सेट है, तो यह मल्टी-बाइट अनुक्रम की शुरुआत को इंगित करता है; लगातार उच्च बिट्स सेट की संख्या बाइट्स की संख्या को इंगित करती है, फिर एक 0, और शेष बिट्स मूल्य में योगदान करते हैं। अन्य बाइट्स के लिए, उच्चतम दो बिट्स 1 और 0 होंगे और शेष 6 बिट्स मान के लिए हैं।
तो एक चार बाइट अनुक्रम 11110 के साथ शुरू होगा ... (और ... मूल्य के लिए तीन बिट्स) फिर मूल्य के लिए प्रत्येक 6 बिट के साथ तीन बाइट्स, एक 21 बिट मूल्य की उपज। 2 ^ 21 यूनिकोड वर्णों की संख्या से अधिक है, इसलिए यूनिकोड के सभी UTF8 में व्यक्त किए जा सकते हैं।
इस तालिका के अनुसार * UTF-8 का समर्थन करना चाहिए :
२ ३१ = २,१४ 31,४,३,६४ = वर्ण
हालाँकि, RFC 3629 ने संभावित मूल्यों को प्रतिबंधित कर दिया है, इसलिए अब हम 4 बाइट्स पर छाया हुआ है , जो हमें देता है
2 21 = 2,097,152 अक्षर
ध्यान दें कि उन पात्रों का एक अच्छा हिस्सा कस्टम उपयोग के लिए "आरक्षित" है, जो वास्तव में आइकन-फोंट के लिए बहुत आसान है।
* विकिपीडिया ने 6 बाइट्स के साथ एक तालिका का उपयोग किया है - वे लेख को अद्यतन करने के बाद से हैं।
2017-07-11: एक ही कोड पॉइंट को कई बाइट्स के साथ एन्कोडेड डबल-काउंटिंग के लिए ठीक किया गया
0xxxxxxx
7 प्रयोग करने योग्य बिट्स 110xxxxx 10xxxxxx
देता है , 11 और देता है - कोई ओवरलैप नहीं है। पहला बाइट 0
पहले मामले में, और 1
दूसरे मामले में शुरू होता है ।
00000001
स्टोर करता है और क्या 11000000 100000001
स्टोर करता है?
यूनिकोड वर्णों को कोड पॉइंट्स हल करता है। यूटीएफ -8 यूनिकोड के लिए एक भंडारण तंत्र है। यूनिकोड के पास एक युक्ति है। UTF-8 में एक युक्ति है। उन दोनों की अलग-अलग सीमाएँ हैं। UTF-8 की अलग-अलग सीमा होती है।
यूनिकोड को "विमानों" के साथ नामित किया गया है । प्रत्येक विमान में 2 16 कोड पॉइंट होते हैं। यूनिकोड में 17 योजनाएँ हैं। कुल 17 * 2^16
कोड अंकों के लिए। पहले विमान, विमान 0 या बीएमपी , यह क्या किया जाता है के वजन में विशेष है।
सभी बारीकियों को समझाने के बजाय, मैं बस ऊपर दिए गए लेख को विमानों पर उद्धृत करता हूं।
17 विमानों में 1,114,112 कोड पॉइंट हो सकते हैं। इनमें से, 2,048 सरोगेट हैं, 66 गैर-वर्ण हैं, और 137,468 निजी उपयोग के लिए आरक्षित हैं, सार्वजनिक असाइनमेंट के लिए 974,530 को छोड़कर।
अब ऊपर दिए गए लेख पर वापस चलते हैं,
UTF-8 द्वारा उपयोग की जाने वाली एन्कोडिंग योजना को 2 31 कोड पॉइंट (32,768 विमानों) की बहुत बड़ी सीमा के साथ डिज़ाइन किया गया था , और 4 बाइट्स तक सीमित होने पर भी 2 21 कोड पॉइंट (32 प्लेन) को एनकोड कर सकते हैं । [3] चूंकि यूनिकोड उन 17 बिंदुओं के कोड बिंदुओं को सीमित करता है जो UTF-16 द्वारा एन्कोड किए जा सकते हैं, 0x10FFFF से ऊपर के कोड बिंदु UTF-8 और UTF-32 में अमान्य हैं।
तो आप देख सकते हैं कि आप UTF-8 में सामान रख सकते हैं जो कि यूनिकोड मान्य नहीं है। क्यों? क्योंकि यूटीएफ -8 उन कोड बिंदुओं को समायोजित करता है जो यूनिकोड भी समर्थन नहीं करता है।
UTF-8, यहां तक कि चार बाइट सीमा के साथ, 2 21 कोड बिंदुओं का समर्थन करता है , जो कि कहीं अधिक है17 * 2^16
2,164,864 "वर्ण" को UTF-8 द्वारा संभावित रूप से कोडित किया जा सकता है।
यह संख्या 2 ^ 7 + 2 ^ 11 + 2 ^ 16 + 2 ^ 21 है जो एन्कोडिंग के काम करने के तरीके से आती है:
1-बाइट 0xxxxxxx
चार्ट में एन्कोडिंग के लिए 7 बिट्स
(0x00-0x7F) हैं
2-बाइट 110xxxxx 10xxxxxx
चार्ट में एन्कोडिंग के लिए 11 बिट्स होते हैं
(पहले बाइट के लिए 0xC0-0xDF, दूसरे के लिए 0x80-0xBF)
3-बाइट 1110xxxx 10xxxxxx 10xxxxxx
चार्ट में एन्कोडिंग के लिए 16 बिट्स हैं
(पहली बाइट के लिए 0xE0-0xEF; निरंतर बाइट्स के लिए 0x80-0xBF)
4-बाइट 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
चार्ट में एन्कोडिंग के लिए 21 बिट्स हैं
(पहली बाइट के लिए 0xF0-0xF7; निरंतर बाइट्स के लिए 0x80-0xBF)
जैसा कि आप देख सकते हैं कि यह वर्तमान यूनिकोड (1,112,064 वर्ण) से काफी बड़ा है।
अपडेट करें
मेरी प्रारंभिक गणना गलत है क्योंकि यह अतिरिक्त नियमों पर विचार नहीं करता है। अधिक विवरण के लिए इस उत्तर पर टिप्पणी देखें।
UTF-8 एक चर लंबाई एन्कोडिंग है जिसमें न्यूनतम 8 बिट प्रति वर्ण है।
उच्च कोड बिंदुओं वाले वर्ण 32 बिट तक ले जाएंगे।
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
, इसलिए वास्तविक चरित्र को एन्कोडिंग के लिए केवल 21 बिट्स का उपयोग किया जा सकता है।
विकिपीडिया से उद्धरण: "यूटीएफ -8 यूनिकोड चरित्र में 1,112,064 कोड बिंदुओं में से प्रत्येक को एक से चार 8-बिट बाइट्स (यूनिकोड मानक में" ओकटेट्स "कहा जाता है) का उपयोग करते हुए एन्कोड करता है।"
कुछ लिंक:
यूनिकोड मानक और संबंधित जानकारी, जैसे उनके FAQ प्रविष्टि, UTF-8 UTF-16, UTF-32 &OM । यह इतना आसान नौकायन नहीं है, लेकिन यह आधिकारिक जानकारी है, और जो आप UTF-8 के बारे में पढ़ सकते हैं वह कहीं और संदिग्ध है।
"UTF-8" में "8" कोड इकाइयों की लंबाई से संबंधित है बिट्स में । कोड इकाइयाँ ऐसी संस्थाएँ हैं जो वर्णों को एनकोड करने के लिए उपयोग करती हैं, जरूरी नहीं कि एक साधारण वन-टू-वन मैपिंग के रूप में हो। किसी वर्ण को एनकोड करने के लिए UTF-8 कोड इकाइयों की एक चर संख्या का उपयोग करता है।
UTF-8 में एन्कोड किए जा सकने वाले वर्णों का संग्रह UTF-16 या UTF-32, यानी सभी यूनिकोड वर्णों के समान है। वे सभी पूरे यूनिकोड कोडिंग स्थान को कूटबद्ध करते हैं, जिसमें गैर-अंशधारी और बिना कोड वाले अंक भी शामिल होते हैं।
जबकि मैं वर्तमान अधिकतम UTF-8 कोड (2,164,864) पर mpen से सहमत हूं (नीचे सूचीबद्ध, मैं उस पर कोई टिप्पणी नहीं कर सकता), वह 2 स्तरों से बंद है यदि आप UTF-8 के 2 प्रमुख प्रतिबंधों को हटाते हैं: केवल 4 बाइट्स सीमा और कोड 254 और 255 का उपयोग नहीं किया जा सकता है (उन्होंने केवल 4 बाइट सीमा को हटा दिया)।
आरंभिक कोड 254, बिट्स शुरू करने की मूल व्यवस्था (1 से 6 सेट, 1 1 की गिनती, और टर्मिनल 0, कोई अतिरिक्त बिट्स) की बुनियादी व्यवस्था का अनुसरण करता है, जो आपको 6 अतिरिक्त बाइट्स (6 10xxxxxx समूह, एक अतिरिक्त 2 ^) के साथ काम करने के लिए देता है। 36 कोड)।
प्रारंभिक 255 कोड मूल सेटअप का पालन नहीं करता है, कोई भी टर्मिनल 0 नहीं है, लेकिन सभी बिट्स का उपयोग किया जाता है, आपको 7 अतिरिक्त बाइट्स (1 के लिए बहु-बिट ध्वज सेट, 7 1 की गिनती और कोई टर्मिनल 0 नहीं देता है क्योंकि सभी बिट्स का उपयोग किया जाता है ; 7 10xxxxxx समूह, एक अतिरिक्त 2 ^ 42 कोड)।
इन्हें जोड़ने पर 4,468,982,745,216 का अंतिम अधिकतम प्रस्तुत करने योग्य चरित्र सेट मिलता है। यह वर्तमान उपयोग, पुरानी या मृत भाषाओं और किसी भी मानी गई भाषाओं की तुलना में सभी वर्णों से अधिक है। एंजेलिक या दिव्य स्क्रिप्ट किसी को भी?
इसके अलावा एकल बाइट कोड हैं जिन्हें 254 और 255: 128-191 के अलावा UTF-8 मानक में अनदेखा / अनदेखा किया गया है, और कुछ अन्य। कुछ का उपयोग स्थानीय रूप से कीबोर्ड द्वारा किया जाता है, उदाहरण के लिए कोड 128 आमतौर पर एक हटाने वाला बैकस्पेस है। अन्य शुरुआती कोड (और संबंधित रेंज) एक या अधिक कारणों ( https://en.wikipedia.org/wiki/UTF-8#Invalid_byte_fterences ) के लिए अमान्य हैं ।
यूनिकोड ने मजबूती से UTF-8 से शादी की है। यूनिकोड विशेष रूप से 2 ^ 21 कोड बिंदुओं (2,097,152 वर्ण) का समर्थन करता है, जो कि यूटीएफ -8 द्वारा समर्थित कोड बिंदुओं की एक समान संख्या है। दोनों प्रणालियाँ कोड पॉइंट्स आदि के लिए समान 'डेड' स्पेस और प्रतिबंधित ज़ोन आरक्षित करती हैं ... जून 2018 के अनुसार सबसे हालिया संस्करण, यूनिकोड 11.0, में 137,439 अक्षरों का एक संग्रह है।
यूनिकोड मानक से। यूनिकोड FAQ
यूनिकोड स्टैंडर्ड ने U + 0000..U + 10FFFF की सीमा में वर्णों को एनकोड किया है, जो 21-बिट कोड स्पेस की मात्रा है।
UTF-8 विकिपीडिया पृष्ठ से। UTF-8 विवरण
2003 में यूनिकोड कोड-स्पेस के 21-बिट मानों पर प्रतिबंध के बाद से, यूटीएफ -8 को एक से चार बाइट्स में कोड बिंदुओं को एनकोड करने के लिए परिभाषित किया गया है, ...