UTF-8 कितने वर्णों को कूटबद्ध कर सकता है?


97

यदि UTF-8 8 बिट्स है, तो क्या इसका मतलब यह नहीं है कि अधिकतम 256 विभिन्न वर्ण हो सकते हैं?

पहले 128 कोड पॉइंट ASCII की तरह ही हैं। लेकिन यह कहता है कि UTF-8 लाखों पात्रों तक का समर्थन कर सकता है?

यह कैसे काम करता है?


2
यदि आप इस प्रश्न का पुनर्मूल्यांकन कर सकते हैं क्योंकि सभी उत्तर गलत हैं। मेरा जवाब पढ़ें: stackoverflow.com/a/45042566/124486
Evan Carroll

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

1
इस सवाल का जवाब मैंने कुछ समय पहले दिया था, इसे सीधे करने की कोशिश में: यह बहुत अच्छा होगा अगर आप इसे चुने गए उत्तर के खिलाफ कहेंगे, जो कि शाब्दिक रूप से एक एकल विकिपीडिया उद्धरण है जो पूरी कहानी नहीं बताता है (उम्मीद है कि मेरा अपडेट बहुत साफ है)
इवान कैरोल

जवाबों:


135

UTF-8 हर समय एक बाइट का उपयोग नहीं करता है, यह 1 से 4 बाइट्स है।

पहले 128 अक्षरों (US-ASCII) को एक बाइट की आवश्यकता होती है।

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

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

यूनिकोड के अन्य विमानों में पात्रों के लिए चार बाइट्स की आवश्यकता होती है, जिसमें कम सामान्य सीजेके वर्ण, विभिन्न ऐतिहासिक लिपियाँ, गणितीय प्रतीक और इमोजी (चित्रात्मक प्रतीक) शामिल हैं।

स्रोत: विकिपीडिया


हाय @zwippie मैं इस के लिए नया। वहाँ कुछ मैं इसे नहीं है। BMP आपके द्वारा कहे गए 2 बाइट्स का उपयोग करता है 3? क्या मै गलत हु?
चिपरोर्टिज़

1
@chiperortiz, BMP वास्तव में 16 बिट्स है, इसलिए इसे UTF-16 के रूप में प्रति वर्ण निरंतर लंबाई के साथ एन्कोड किया जा सकता है (UTF-16 भी 16 बिट्स से आगे जाने का समर्थन करता है, लेकिन यह एक कठिन अभ्यास है, और कई कार्यान्वयन इसका समर्थन नहीं करते हैं)। हालाँकि, UTF-8 के लिए, आपको यह भी एनकोड करने की आवश्यकता है कि यह कब तक होगा, इसलिए आप कुछ बिट्स खो देते हैं। यही कारण है कि आपको BMP को पूरा करने के लिए 3 बाइट्स की आवश्यकता होती है। यह बेकार लग सकता है, लेकिन याद रखें कि UTF-16 हमेशा 2 बाइट्स का उपयोग करता है, लेकिन UTF-8 अधिकांश लैटिन-आधारित भाषा वर्णों के लिए प्रति वर्ण एक बाइट का उपयोग करता है। इसे दो बार कॉम्पैक्ट के रूप में बनाना।
sanderd17

ओपी के प्रश्न का मुख्य जोर यूटीएफ- 8 क्यों कहा जाता है से संबंधित है - इसका वास्तव में जवाब नहीं है।
jbyrd

39

UTF-8 प्रति वर्ण 1-4 बाइट्स का उपयोग करता है: एससीआई वर्णों के लिए एक बाइट (पहले 128 यूनिकोड मान एससीआई के समान हैं)। लेकिन इसके लिए केवल 7 बिट्स की आवश्यकता होती है। यदि उच्चतम ("साइन") बिट सेट है, तो यह मल्टी-बाइट अनुक्रम की शुरुआत को इंगित करता है; लगातार उच्च बिट्स सेट की संख्या बाइट्स की संख्या को इंगित करती है, फिर एक 0, और शेष बिट्स मूल्य में योगदान करते हैं। अन्य बाइट्स के लिए, उच्चतम दो बिट्स 1 और 0 होंगे और शेष 6 बिट्स मान के लिए हैं।

तो एक चार बाइट अनुक्रम 11110 के साथ शुरू होगा ... (और ... मूल्य के लिए तीन बिट्स) फिर मूल्य के लिए प्रत्येक 6 बिट के साथ तीन बाइट्स, एक 21 बिट मूल्य की उपज। 2 ^ 21 यूनिकोड वर्णों की संख्या से अधिक है, इसलिए यूनिकोड के सभी UTF8 में व्यक्त किए जा सकते हैं।


@NickL। नहीं, मेरा मतलब है 3 बाइट्स। कि उदाहरण में, यदि एक multibyte अनुक्रम के पहले बाइट शुरू होता है 1111, पहले 1 इंगित करता है कि यह है एक multibyte अनुक्रम की शुरुआत है, तो उसके बाद लगातार 1 की संख्या की संख्या बताने वाले अतिरिक्त अनुक्रम में बाइट्स (ताकि एक पहले बाइट या तो 110, 1110 या 11110) से शुरू होगी।
CodeClown42

RFC 3629 में अपने शब्दों के लिए प्रमाण मिला । tools.ietf.org/html/rfc3629#section-3 । हालाँकि, मुझे समझ में नहीं आता है कि मुझे दूसरी बाइट 110xxxxx 10xxxxxx की शुरुआत में "10" रखने की आवश्यकता क्यों है? सिर्फ 110xxxxx xxxxxxxx ही क्यों?
kolobok

3
Softwareengineering.stackexchange.com/questions/262227/… में उत्तर मिला । बस सुरक्षा कारणों से (यदि धारा के बीच में एक भी बाइट दूषित है)
kolobok

@kolobok आह। Sans सुरक्षा तो आप 3 बाइट्स में एक 21-बिट मान सांकेतिक शब्दों में बदलना कर सकते हैं (3 बिट्स लंबाई, प्लस 21-बिट्स का संकेत)। : D संभवतया ऐसा नहीं है, हालांकि कम से कम WRT पश्चिमी भाषाओं में।
CodeClown42

मैं अनुमान लगा रहा हूँ कि NickL ने यह पूछा लेकिन उस पहले बाइट में बाकी बिट्स का क्या हुआ अगर ... बिट्स के बजाय बाद के बाइट्स का प्रतिनिधित्व करता है?
c6754

26

इस तालिका के अनुसार * UTF-8 का समर्थन करना चाहिए :

३१ = २,१४ 31,४,३,६४ = वर्ण

हालाँकि, RFC 3629 ने संभावित मूल्यों को प्रतिबंधित कर दिया है, इसलिए अब हम 4 बाइट्स पर छाया हुआ है , जो हमें देता है

2 21 = 2,097,152 अक्षर

ध्यान दें कि उन पात्रों का एक अच्छा हिस्सा कस्टम उपयोग के लिए "आरक्षित" है, जो वास्तव में आइकन-फोंट के लिए बहुत आसान है।

* विकिपीडिया ने 6 बाइट्स के साथ एक तालिका का उपयोग किया है - वे लेख को अद्यतन करने के बाद से हैं।

2017-07-11: एक ही कोड पॉइंट को कई बाइट्स के साथ एन्कोडेड डबल-काउंटिंग के लिए ठीक किया गया


यह उत्तर डबल एन्कोडिंग की संख्या की गणना कर रहा है। एक बार जब आप सभी 2 ^ 7 की गणना कर लेते हैं, तो आप उन्हें 2 ^ 11, 2 ^ 16 आदि में फिर से नहीं गिन सकते। संभव है कि एनकोडिंग की सही संख्या 2 ^ 21 हो (हालांकि वर्तमान में सभी का उपयोग नहीं किया जा रहा है)।
जिमी

@ जिमी तुम्हें यकीन है कि मैं डबल गिनती कर रहा हूँ? 0xxxxxxx7 प्रयोग करने योग्य बिट्स 110xxxxx 10xxxxxxदेता है , 11 और देता है - कोई ओवरलैप नहीं है। पहला बाइट 0पहले मामले में, और 1दूसरे मामले में शुरू होता है ।
मपेन

@ तो क्या कोड बिंदु 00000001स्टोर करता है और क्या 11000000 100000001स्टोर करता है?
इवान कैरोल

1
@EvanCarroll उह .... बिंदु लिया। एक ही कोड बिंदु को एनकोड करने के कई तरीके नहीं थे।
एमपीएन

1
मैंने स्वयं इसका उत्तर देने का प्रयास किया, देखें कि क्या आपको लगता है कि यह एक बेहतर व्याख्या है और इस प्रश्न का उत्तर है: stackoverflow.com/a/45042566/124486
Evan Carroll

21

यूनिकोड बनाम यूटीएफ -8

यूनिकोड वर्णों को कोड पॉइंट्स हल करता है। यूटीएफ -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

अब ऊपर दिए गए लेख पर वापस चलते हैं,

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


18

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 वर्ण) से काफी बड़ा है।

अपडेट करें

मेरी प्रारंभिक गणना गलत है क्योंकि यह अतिरिक्त नियमों पर विचार नहीं करता है। अधिक विवरण के लिए इस उत्तर पर टिप्पणी देखें।


2
आपका गणित UTF-8 नियम का सम्मान नहीं करता है कि केवल कोड कोड को एनकोड करने के लिए सबसे कम कोड यूनिट अनुक्रम की अनुमति है। तो, 00000001 U + 0001 के लिए मान्य है, लेकिन 11110000 10000000 10000000 10000001 नहीं है। रेफरी: तालिका 3-7। अच्छी तरह से गठित UTF-8 बाइट अनुक्रम । इसके अलावा, सवाल सीधे तालिका द्वारा उत्तर दिया जाता है: आप बस श्रेणियाँ जोड़ते हैं। (वे UTF-16 के लिए सरोगेट्स को बाहर करने से असहमति रखते हैं)।
टॉम ब्लोडेट

टॉम - आपकी टिप्पणी के लिए धन्यवाद! मैं उन प्रतिबंधों से अनभिज्ञ था। मैंने तालिका 3-7 देखी और संख्याएँ भाग लीं और ऐसा लग रहा है कि 1,083,392 संभव वैध अनुक्रम हैं।
रूबेन

6

UTF-8 एक चर लंबाई एन्कोडिंग है जिसमें न्यूनतम 8 बिट प्रति वर्ण है।
उच्च कोड बिंदुओं वाले वर्ण 32 बिट तक ले जाएंगे।


2
यह भ्रामक है। आपके पास सबसे लंबा कोड बिंदु हो सकता है 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx, इसलिए वास्तविक चरित्र को एन्कोडिंग के लिए केवल 21 बिट्स का उपयोग किया जा सकता है।
बोरिस

5
मैंने कहा कि कोड पॉइंट्स को 32 बिट्स तक एन्कोड किया जा सकता है, मैंने कभी दावा नहीं किया कि (इंडक्शन द्वारा) आप 32 बिट UTF-8 में 2 ^ 32 कैरेक्टर्स को एनकोड कर सकते हैं। लेकिन यह बल्कि लूट है, क्योंकि आप UTF-8 में सभी मौजूदा यूनिकोड वर्णों को एन्कोड कर सकते हैं , और यदि आप UTF-8 को 48 बिट्स (जो मौजूद है लेकिन पदावनत है) में फैलाते हैं, तो आप और भी एन्कोड कर सकते हैं , इसलिए मुझे यकीन नहीं है कि क्या है भ्रामक बिंदु है।
deceze

3

विकिपीडिया से उद्धरण: "यूटीएफ -8 यूनिकोड चरित्र में 1,112,064 कोड बिंदुओं में से प्रत्येक को एक से चार 8-बिट बाइट्स (यूनिकोड मानक में" ओकटेट्स "कहा जाता है) का उपयोग करते हुए एन्कोड करता है।"

कुछ लिंक:


2

यूनिकोड मानक और संबंधित जानकारी, जैसे उनके FAQ प्रविष्टि, UTF-8 UTF-16, UTF-32 &OM । यह इतना आसान नौकायन नहीं है, लेकिन यह आधिकारिक जानकारी है, और जो आप UTF-8 के बारे में पढ़ सकते हैं वह कहीं और संदिग्ध है।

"UTF-8" में "8" कोड इकाइयों की लंबाई से संबंधित है बिट्स में । कोड इकाइयाँ ऐसी संस्थाएँ हैं जो वर्णों को एनकोड करने के लिए उपयोग करती हैं, जरूरी नहीं कि एक साधारण वन-टू-वन मैपिंग के रूप में हो। किसी वर्ण को एनकोड करने के लिए UTF-8 कोड इकाइयों की एक चर संख्या का उपयोग करता है।

UTF-8 में एन्कोड किए जा सकने वाले वर्णों का संग्रह UTF-16 या UTF-32, यानी सभी यूनिकोड वर्णों के समान है। वे सभी पूरे यूनिकोड कोडिंग स्थान को कूटबद्ध करते हैं, जिसमें गैर-अंशधारी और बिना कोड वाले अंक भी शामिल होते हैं।


1

जबकि मैं वर्तमान अधिकतम 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 ) के लिए अमान्य हैं ।


0

यूनिकोड ने मजबूती से 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 को एक से चार बाइट्स में कोड बिंदुओं को एनकोड करने के लिए परिभाषित किया गया है, ...


21 बिट्स को गोल किया जाता है। यूनिकोड का कहना है कि यह 1,114,112 कोडपॉइंट्स (U + 0000 से U + 10FFFF) को सपोर्ट करता है। (कभी-कभी 65536 के 17 विमानों के रूप में वर्णित है।)
टॉम ब्लोडेट

@TomBlodget, आप सही हैं। इस चर्चा से सबसे प्रासंगिक संकेत यह है कि यूटीएफ -8 यूनिकोड मानक में वर्तमान में परिभाषित सभी बिंदुओं को सांकेतिक शब्दों में बदल सकता है और आने वाले कुछ समय के लिए ऐसा करने में सक्षम होगा।
प्रदर्शित नाम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.