यूनिकोड के साथ कितने पात्रों को मैप किया जा सकता है?


82

मैं स्पष्टीकरण के साथ यूनिकोड में सभी संभावित मान्य संयोजनों की गिनती के लिए कह रहा हूं। मुझे पता है कि एक चार्ट को 1,2,3 या 4 बाइट के रूप में एन्कोड किया जा सकता है। मुझे यह भी समझ में नहीं आ रहा है कि निरंतर बाइट्स पर प्रतिबंध क्यों है हालांकि उस चार बाइट को शुरू करने से यह स्पष्ट हो जाता है कि यह कितना लंबा होना चाहिए।

जवाबों:


118

मैं स्पष्टीकरण के साथ यूनिकोड में सभी संभावित मान्य संयोजनों की गिनती के लिए कह रहा हूं।

1,111,998 : 17 प्लेन × 65,536 वर्ण प्रति विमान - 2048 सरोगेट - 66 नॉनचैकर

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

137,929 कोड पॉइंट वास्तव में यूनिकोड 12.1 में दिए गए हैं

मुझे यह भी समझ में नहीं आता है कि निरंतर बाइट पर प्रतिबंध क्यों है, हालांकि उस चार बाइट को शुरू करने से यह स्पष्ट हो जाता है कि यह कितनी देर तक होना चाहिए।

UTF-8 में इस प्रतिबंध का उद्देश्य एन्कोडिंग को आत्म-समकालिक बनाना है

एक प्रतिधारण के लिए, चीनी जीबी 18030 एन्कोडिंग पर विचार करें । वहां, अक्षर ßको बाइट अनुक्रम के रूप में दर्शाया गया है 81 30 89 38, जिसमें अंकों का एन्कोडिंग 0और है 8। इसलिए यदि आपके पास एक स्ट्रिंग-खोज फ़ंक्शन है जो इस एन्कोडिंग-विशिष्ट क्विक के लिए डिज़ाइन नहीं किया गया है, तो अंक के लिए एक खोज 8पत्र के भीतर एक गलत खोजेगीß

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


2
आपके द्वारा लिंक किया गया "सेल्फ-सिंक्रनाइज़िंग" आलेख यह नहीं समझाता है कि सभी में आत्म-सिंक्रोनाइज़िंग क्या है
पेसियर

एक दिलचस्प नोट के रूप में, यूटीएफ 8 को सभी यूनिकोड वर्णों को मैप करने के लिए केवल 4 बाइट्स की आवश्यकता होती है, लेकिन यूटीएफ 8 68 बिलियन वर्णों तक समर्थन कर सकता है यदि कभी भी आवश्यकता होती है, तो प्रति वर्ण 7 बाइट्स तक ले जा सकता है।
सैंटियागो एरीज़टी

10

यूनिकोड 17 विमानों के लिए अनुमति देता है , 65,536 संभावित पात्रों (या 'कोड पॉइंट') में से प्रत्येक के । यह कुल 1,114,112 संभावित अक्षर देता है। वर्तमान में, इस स्थान का केवल 10% आवंटित किया गया है।

इन कोड बिंदुओं को कैसे एन्कोड किया गया है, इसका सटीक विवरण एन्कोडिंग के साथ अलग-अलग है, लेकिन आपका प्रश्न यह ध्वनि करता है जैसे आप यूटीएफ -8 के बारे में सोच रहे हैं। निरंतर बाइट्स पर प्रतिबंध का कारण संभवतः है, इसलिए अगले चरित्र की शुरुआत ढूंढना आसान है (जैसा कि निरंतरता वर्ण हमेशा फॉर्म 10xxxxxx होते हैं, लेकिन शुरुआती बाइट कभी भी इस रूप का नहीं हो सकता है)।


इन "विमानों" के अनुसार, यहां तक ​​कि 4 बाइट चार के अंतिम तीन बाइट उनमें से 64 को व्यक्त कर सकते हैं। क्या मै गलत हु?
उफुक हैसियोउल्लारिए

हाँ, यह सिंक्रनाइज़ेशन के लिए है, देखें cl.cam.ac.uk/~mgk25/ucs/utf-8-history.txt
ninjalj

2
मुझे लगता है कि पुराना है। यह अब 6 बाइट्स का उपयोग नहीं करता है
उफुक हैसियोउल्लर

3
@ और: यह समझ में आता है: UTF-8 के लिए मूल कल्पना बड़ी संख्या के लिए काम करती है। 21-बिट सीमा उन लोगों के लिए एक सॉप थी, जिन्होंने खुद को 16-बिट वर्णों में बंद कर दिया था, और इस तरह यूसीएस -2 ने यूटीएफ -16 के रूप में ज्ञात घृणा को छोड़ दिया।
tchrist

1
@ साइमन: 34 नॉनचैकर कोड पॉइंट हैं, कुछ भी जब 0xFFFE == 0xFFFE के साथ बिटवाइड-एड किया जाता है, तो प्रति प्लेन में दो ऐसे कोड पॉइंट होते हैं। इसके अलावा, 0x00_FDD0 .. 0x00_FDEF रेंज में 31 नॉनचैकर कोड पॉइंट हैं। साथ ही आपको उस से सरोगेट करना चाहिए, जो UTF-16 दोष के कारण खुले इंटरचेंज के लिए कानूनी नहीं है, लेकिन आपके प्रोग्राम के अंदर समर्थित होना चाहिए।
tchrist

5

यूनिकोड 1,114,112 कोड बिंदुओं का समर्थन करता है। 2048 सरोगेट कोड पॉइंट हैं, जो 1,112,064 स्केलर वैल्यू देते हैं। इनमें से, 66 गैर-वर्ण हैं, जिसके कारण 1,111,998 संभव एन्कोडेड वर्ण हैं (जब तक कि मैंने कोई गणना त्रुटि नहीं की है)।


क्या आप मेरे उत्तर को देख सकते हैं? 1,112,114 कोड बिंदु क्यों है?
उफुक हैसियोउल्लारि

3
यह नंबर उन विमानों की संख्या से आता है जो UTF-16 सरोगेट सिस्टम का उपयोग कर पता करने योग्य हैं। आपके पास 1024 कम गैर-बीएमपी कोड अंक देने वाले 1024 कम सरोगेट और 1024 उच्च सरोगेट हैं। यह प्लस 65,536 बीएमपी कोड अंक बिल्कुल 1,114,112 देता है।
फिलीपिंस

2
@Philipp, लेकिन आप अपने उत्तर में '1_112_114' देते हैं, लेकिन आप अपनी टिप्पणी में '1_114_112' की व्याख्या करते हैं। शायद आपने 2 और 4 को मिलाया
शॉन कोवाक

1
यह उत्तर वर्षों से गणना की त्रुटियों के आसपास बैठा है, इसलिए मैंने इसे साफ करने के लिए स्वतंत्रता ली। हां, जवाब में 1112114 का मान टाइपो था। सही मान 1114112 है, जो 0x110000 का दशमलव मान है।
रे तोल

1

एक सटीक रूप से सटीक उत्तर देने के लिए, all of them

UTF-8 एन्कोडिंग में निरंतर बाइट्स "लाइन शोर" के चेहरे में एन्कोडेड ऑक्टेट स्ट्रीम के पुन: सिंक्रनाइज़ेशन की अनुमति देता है। एनकोडर, केवल एक बाइट के लिए स्कैन को आगे बढ़ाने की आवश्यकता होती है जिसमें 0x80 और 0xBF के बीच मान नहीं होता है ताकि यह पता चले कि अगला बाइट एक नए चरित्र बिंदु की शुरुआत है।

सिद्धांत रूप में, आज इस्तेमाल किए जाने वाले एन्कोडिंग उन पात्रों की अभिव्यक्ति की अनुमति देते हैं जिनकी यूनिकोड वर्ण संख्या लंबाई में 31 बिट्स तक है। व्यवहार में, इस एन्कोडिंग को वास्तव में ट्विटर जैसी सेवाओं पर लागू किया जाता है, जहां अधिकतम लंबाई का ट्वीट 4,340 बिट्स के डेटा के लिए एन्कोड कर सकता है। (140 अक्षर [वैध और अमान्य], प्रत्येक बार 31 बिट्स।)


Actaully, सिद्धांत रूप में यह 31 बिट्स तक सीमित नहीं है, आप 64 बिट मशीन पर बड़ा जा सकते हैं। perl -le 'print ord "\x{1FFF_FFFF_FFFF}"'64-बिट मशीन पर 35184372088831 प्रिंट करता है, लेकिन 32-बिट मशीन पर पूर्णांक ओवरफ़्लो देता है। आप अपने पर्ल प्रोग्राम के अंदर इस तरह के बड़े चार्ज़ का उपयोग कर सकते हैं, लेकिन यदि आप उन्हें utf8 के रूप में प्रिंट करने का प्रयास करते हैं, तो आपको एक अनिवार्य चेतावनी मिलती है जब तक कि आप ऐसे अक्षम न करें perl -le 'print "\x{1FFF_FFFF}"' Code point 0x1FFFFFFF is not Unicode, may not be portable at -e line 1. ######:। "ढीले utf8" और "सख्त UTF-8" के बीच अंतर है: पूर्व प्रतिबंधित नहीं है।
tchrist

1
आज इस्तेमाल किए गए एनकोडिंग 31-बिट स्केलर मानों की अनुमति नहीं देते हैं। UTF-32 32-बिट मानों के लिए अनुमति देगा, UTF-8 और भी अधिक के लिए, लेकिन UTF-16 (Windows, OS X, Java, .NET, पायथन द्वारा आंतरिक रूप से उपयोग किया जाता है और इसलिए सबसे लोकप्रिय एन्कोडिंग योजना) बस के लिए अनुमति देता है एक मिलियन (जो अभी भी पर्याप्त होना चाहिए)।
फिलीपींस

1
"वे सभी" काफी सटीक नहीं हैं; विरासत एन्कोडिंग में वर्ण हैं जो यूनिकोड में नहीं हैं। उदाहरण के लिए, MacRoman में Apple लोगो, और ATASCII में ग्राफिक्स वर्णों के एक जोड़े। OTOH, एक निजी उपयोग क्षेत्र है, इसलिए इन पात्रों को यूनिकोड के साथ मैप किया जा सकता है; वे सिर्फ मानक का हिस्सा नहीं हैं।
dan04

1
@ टीचर: पायथन 3 यूटीएफ -16 का उपयोग करता है; उदाहरण के लिए, अपने सिस्टम पर मैं कह सकता हूं len(chr(0x10000)), 2 (कोड यूनिट) दे रहा हूं । OS X का कर्नेल UTF-8 का उपयोग करता है, सही- लेकिन उच्च-स्तरीय API (कोको आदि) UTF-16 का उपयोग करता है।
फिलीपिंस

1
@ फिलिप: मैं केवल पायथन 2 का उपयोग करता हूं, जिसका यूनिकोड समर्थन वांछित होने के लिए बहुत कुछ छोड़ देता है। मैं एक सिस्टम आदमी हूं, इसलिए मैं एंड-यूज़र क्रोम-प्लेटिंग नहीं करता: ओएस एक्स पर उपयोग किए जाने वाले सभी सीस्कल्स यूटीएफ -8 लेते हैं, जो कर्नेल आपके लिए एनएफसी में परिवर्तित हो जाता है। जावा में मेरे यूटीएफ -16 के अनुभव खराब रहे हैं: रीजैक्स ब्रैकेटेड चारक्लैस मैच को शाब्दिक के साथ उनके कुछ गैर-बीएमपी कोडपॉइंट्स के साथ मैच करने की कोशिश करें, जैसे कि [𝒜-𝒵], और आप देखेंगे कि मुझे यूटीएफ -16 को बॉट करने के लिए एक्सपोजर क्यों मिला। तार्किक पात्रों के बजाय प्रोग्रामर को एन्कोडिंग रूपों में सोचने के लिए यह एक गलती है।
19


1

विकिपीडिया के अनुसार , यूनिकोड 12.1 (मई 2019 में जारी) में 137,994 अलग-अलग वर्ण हैं।


@ यूफुक: यूनिकोड में अक्षर नहीं हैं। इसमें कोड पॉइंट हैं। कभी-कभी एक वर्ण बनाने के लिए कई कोड बिंदुओं की आवश्यकता होती है। उदाहरण के लिए, वर्ण "5 is" दो कोड बिंदु हैं, जबकि चरित्र "ñ" एक या दो कोड हो सकता है (या अधिक!)। 2 are संभावित कोड बिंदु हैं, लेकिन उनमें से कुछ गैर-वर्ण या आंशिक वर्ण के रूप में आरक्षित हैं।
22

6
यूनिकोड एक चरित्र एन्कोडिंग मानक है। Unicode.org/faq/basic_q.html से पहला उत्तर : "यूनिकोड सार्वभौमिक वर्ण एन्कोडिंग है," इसलिए यह कहना कि "यूनिकोड एन्कोडिंग नहीं है" गलत है। (मैंने एक बार खुद ही वह गलती की थी।)
फिलिपिंस

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