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


79

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

मैं UTF-8 में एन्कोड किए गए स्ट्रिंग के बाइट्स को एन्क्रिप्ट कर रहा हूं और इसलिए UTF-8 एनकोडेड स्ट्रिंग के लिए अधिकतम बाइट्स को निकालने में सक्षम होने की आवश्यकता है।

क्या कोई एकल UTF-8 एन्कोडेड वर्ण के लिए अधिकतम बाइट्स की पुष्टि कर सकता है


1
आप किया था इस तरह के रूप में आम संसाधन, पर नज़र विकिपीडिया के UTF-8 अनुच्छेद , पहले ... है ना?

5
मैंने कई लेख पढ़े जिनमें मिश्रित उत्तर दिए गए थे ... मुझे वास्तव में यह धारणा मिली कि उत्तर 3 था इसलिए मुझे बहुत खुशी हुई मैंने पूछा
एड्ड

2
मैं टॉम स्कॉट के कैरेक्टर्स, सिंबल्स , यूनिकोड चमत्कार: goo.gl/sUr1Hf की विशेषता के साथ यहां एक यूट्यूब लिंक छोड़ दूंगा । आपको सुनने और देखने को मिलता है कि कैसे सब कुछ ASCII वर्ण एन्कोडिंग से utf-8 तक विकसित हो रहा है।
रॉय ली

जवाबों:


86

RFC3629 के अनुसार प्रति वर्ण बाइट्स की अधिकतम संख्या 4 है जो वर्ण तालिका को सीमित करता है U+10FFFF:

UTF-8 में, U + 0000..U + 10FFFF श्रेणी (UTF-16 सुलभ श्रेणी) के वर्ण 1 से 4 ऑक्टेट के अनुक्रमों का उपयोग करके एन्कोड किए गए हैं।

(मूल विनिर्देश पिछले अंक कोड के लिए छह बाइट चरित्र कोड के लिए अनुमति दी है U+10FFFF।)

128 से कम कोड वाले वर्णों को केवल 1 बाइट की आवश्यकता होगी, और अगले 1920 वर्ण कोड में केवल 2 बाइट्स की आवश्यकता होती है। जब तक आप एक गूढ़ भाषा के साथ काम नहीं कर रहे हैं, तब तक चरित्र की गिनती को 4 से गुणा करना एक महत्वपूर्ण overestimation होगा।


7
आपके लिए "गूढ़ भाषा" क्या है? कोई भी भाषा जो वास्तविक दुनिया में मौजूद होगी, या एक पाठ जो दुनिया की विभिन्न भाषाओं के बीच स्विच करता है? यदि वह ओवर-आबंटन करता है और वास्तविक रूपांतरण के बाद परिणाम को घटाता है, तो UTF-8-टू-स्ट्रिंग फ़ंक्शन के एक डेवलपर को गुणक के रूप में 2, 3 या 4 का चयन करना चाहिए?
डैनियल मार्शेल

1
'एनिकोट्रिक भाषा' द्वारा @rinntech का मतलब है कि वह एक ऐसी भाषा है जिसमें बहुत अधिक मूल्य के यूनिकोड चार्ट हैं ( इस सूची के निचले हिस्से के पास से कुछ: यूनिकोड-table.com/en/sections )। यदि आपको ओवर-आबंटित होना चाहिए, तो चुनें 4. आप एक डबल पास कर सकते हैं, एक यह देखने के लिए कि आपको कितने बाइट्स की आवश्यकता होगी और आवंटित करें, फिर एन्कोडिंग करने के लिए एक और; यह रैम की जरूरत के 4 गुना आवंटित करने से बेहतर हो सकता है।
मटिउ सिप

9
हमेशा सबसे खराब स्थिति को संभालने की कोशिश करें: hacker9.com/single-message-can-crash-whatsapp.html
इवेशन बोडुनोव

20
CJKV अक्षर ज्यादातर 3 बाइट्स लेते हैं (कुछ दुर्लभ / पुरातन वर्णों के साथ 4 बाइट्स लेने वाले) और उन्हें गूढ़ व्यक्ति कहना थोड़ा खिंचाव है (अकेले चीन दुनिया की आबादी का लगभग 20% है ...)।
TGR

3
जब यह पहले 6 था तब इसे 4 तक सीमित क्यों किया गया था? क्या हमें मानक जारी रखने और की बढ़त बाइट होने से बंद हो जाता है 11111111और एक होने 2^(6*7)पात्रों के लिए थोड़ा अंतरिक्ष?
एरोन फ्रेंके

32

आगे के संदर्भ के बिना, मैं कहूंगा कि UTF-8 में एक चरित्र के लिए बाइट की अधिकतम संख्या है

उत्तर: 6 बाइट्स

स्वीकृत उत्तर के लेखक ने इसे "मूल विनिर्देश" कहा। यह RFC-2279 1 के माध्यम से मान्य था । जैसा कि जे। कोको ने नीचे टिप्पणियों में बताया, यह 2003 में RFC-3629 2 के साथ बदल गया , जो UTF-8 को 21 बिट्स के लिए एन्कोडिंग तक सीमित करता है, जिसे चार बाइट्स का उपयोग करके एन्कोडिंग योजना के साथ संभाला जा सकता है।

सभी यूनिकोड को कवर करने पर उत्तर: 4 बाइट्स

लेकिन, जावा <= v7 में , वे यूटीएफ -8 के साथ यूनिकोड का प्रतिनिधित्व करने के लिए अधिकतम 3-बाइट के बारे में बात करते हैं? ऐसा इसलिए है क्योंकि मूल यूनिकोड विनिर्देशन ने केवल बुनियादी बहुभाषी विमान ( बीएमपी ) को परिभाषित किया है , अर्थात यह यूनिकोड का एक पुराना संस्करण है, या आधुनिक यूनिकोड का सबसेट है। इसलिए

केवल मूल यूनिकोड का प्रतिनिधित्व करने पर उत्तर, बीएमपी: 3 बाइट्स

लेकिन, ओपी दूसरे रास्ते से जाने की बात करते हैं। वर्णों से UTF-8 बाइट्स तक नहीं, बल्कि UTF-8 बाइट्स से बाइट्स प्रतिनिधित्व के "स्ट्रिंग" तक। शायद स्वीकार किए गए उत्तर के लेखक को सवाल के संदर्भ से मिला है, लेकिन यह आवश्यक रूप से स्पष्ट नहीं है, इसलिए इस प्रश्न के आकस्मिक पाठक को भ्रमित कर सकता है।

UTF-8 से देशी एन्कोडिंग में जाने पर, हमें यह देखना होगा कि "स्ट्रिंग" कैसे लागू किया जाता है। कुछ भाषाएँ, जैसे पायथन> = 3 पूर्णांक कोड बिंदुओं के साथ प्रत्येक वर्ण का प्रतिनिधित्व करेंगी, जो कि प्रति वर्ण 4 बाइट्स के लिए अनुमति देता है = 32 बिट्स जो हमें यूनिकोड के लिए आवश्यक हैं, कुछ कचरे के साथ कवर करने के लिए। 21 बिट्स क्यों नहीं? क्योंकि चीजें तेजी से तब होती हैं जब वे बाइट-संरेखित होती हैं। पायथन <= 2 और जावा जैसी कुछ भाषाएं यूटीएफ -16 एन्कोडिंग का उपयोग करते हुए वर्णों का प्रतिनिधित्व करती हैं, जिसका अर्थ है कि उन्हें विस्तारित यूनिकोड (नहीं बीएमपी) का प्रतिनिधित्व करने के लिए सरोगेट जोड़े का उपयोग करना होगा। किसी भी तरह से अभी भी अधिकतम 4 बाइट्स है।

उत्तर दे अगर UTF-8 -> देशी एन्कोडिंग: 4 बाइट्स

तो, अंतिम निष्कर्ष, 4 सबसे आम सही उत्तर है, इसलिए हमने इसे सही पाया। लेकिन, माइलेज अलग हो सकता है।


5
"यह अभी भी वर्तमान और सही विनिर्देश है, प्रति विकिपीडिया" - कोई और नहीं। यह लिखने के कुछ समय बाद (2 अप्रैल को), विकिपीडिया के UTF-8 लेख को यह स्पष्ट करने के लिए बदल दिया गया था कि 6-ऑक्टेट संस्करण वर्तमान (2003) UTF-8 युक्ति का हिस्सा नहीं है।
जे। Cocoe

"लेकिन, जावा <= v7 में, वे यूटीएफ -8 के साथ यूनिकोड का प्रतिनिधित्व करने के लिए अधिकतम 3-बाइट के बारे में बात करते हैं? ऐसा इसलिए है क्योंकि मूल यूनिकोड विनिर्देश ने केवल मूल बहु-भाषी विमान को परिभाषित किया है" - यह शायद मूल कारण है, लेकिन यह पूरी कहानी नहीं है। जावा "संशोधित यूटीएफ -8" का उपयोग करता है, और संशोधनों में से एक यह है कि यह "मानक यूटीएफ -8 के चार-बाइट प्रारूप" (उनके शब्द) के बजाय "अपने स्वयं के दो-तीन-तीन-बाइट प्रारूप" का उपयोग करता है।
जे। कोको

1
10FFFF (केवल एक मिलियन से अधिक) की सीमा से ऊपर कोई कोडपॉइंट आवंटित नहीं किए गए हैं और UTF8 के कई कार्यान्वयनों ने कभी भी 4 बाइट्स (और कुछ केवल 3, जैसे MySQL) से अधिक अनुक्रम लागू नहीं किया है, इसलिए मैं इसे 4 बाइट प्रति हार्ड लिमिट से सुरक्षित मानूंगा पुराने कार्यान्वयन के साथ संगतता पर विचार करते हुए भी कोडपॉइंट। आपको यह सुनिश्चित करने की आवश्यकता होगी कि आप रास्ते में कुछ भी अवैध नहीं छोड़ सकते। ध्यान दें कि सटीक बाइट की लंबाई की गणना के बाद आवंटन के लिए मटिऊ की सिफारिश एक अच्छा है जहां संभव है।
थोमसट्रेटर

2
"... [यू] निकोड x10FFFF कोड बिंदुओं का प्रतिनिधित्व कर सकता है। इसलिए, 0 सहित, इसका मतलब है कि हम इसे इन बाइट्स के साथ कर सकते हैं: एफ एफएफ एफएफ, यानी ढाई बाइट्स, या 20 बिट्स।" मेरा मानना ​​है कि यह थोड़ा गलत है। 0x10FFFF के माध्यम से 0x0 से कोड बिंदुओं की संख्या 0x110000 होगी, जिसे 1F FF FF21 बिट्स में दर्शाया जा सकता है । 0x1100 नंबर प्रत्येक के 0x10000 कोड बिंदुओं के 17 विमानों से मेल खाता है ।
19

2
PSA: विकिपीडिया एक वास्तविक स्रोत नहीं है। लेख के वास्तविक संदर्भों को देखें।
Nyerguds

0

US-ASCII, एक मानक अंग्रेजी वर्णमाला एन्कोडिंग का समर्थन करने के लिए बाइट्स की अधिकतम संख्या है, 1. लेकिन अंग्रेजी में पाठ को सीमित करना कम वांछनीय या व्यावहारिक होता जा रहा है क्योंकि समय बीत जाता है।

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

जबकि UTF-8 वर्ण प्रति बाइट्स की अधिकतम संख्या प्लेन 0 के केवल 2-बाइट एड्रेस स्पेस को सपोर्ट करने के लिए 3 है, बेसिक मल्टीलिंगुअल प्लेन (BMP), जिसे कुछ अनुप्रयोगों में न्यूनतम समर्थन के रूप में स्वीकार किया जा सकता है, यह समर्थन के लिए 4 है यूनिकोड के सभी 17 वर्तमान विमान (2019 तक)। यह ध्यान दिया जाना चाहिए कि कई लोकप्रिय "इमोजी" अक्षर प्लेन 16 में स्थित होने की संभावना है, जिसमें 4 बाइट्स की आवश्यकता होती है।

हालाँकि, यह सिर्फ बेसिक कैरेक्टर ग्लिफ़ के लिए है। विभिन्न मॉडिफायर भी हैं, जैसे कि उच्चारण पिछले चरित्र पर दिखाई देते हैं, और एक जटिल "ग्रैफेम" के निर्माण के लिए कोड बिंदुओं की एक मनमानी संख्या को एक साथ जोड़ना भी संभव है। वास्तविक विश्व प्रोग्रामिंग में, इसलिए, प्रति वर्ण निश्चित बाइट्स की अधिकतम संख्या के उपयोग या अनुमान से अंततः आपके आवेदन के लिए समस्या उत्पन्न होगी।

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


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