utf 8 - UTF-16 का क्या मतलब है?




utf-8 character-encoding (4)

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

मैंने UTF-16 एन्कोडिंग के बिंदु को कभी नहीं समझा। यदि आपको स्ट्रिंग्स को रैंडम एक्सेस के रूप में इलाज करने में सक्षम होने की आवश्यकता है (यानी एक कोड बिंदु कोड यूनिट के समान है) तो आपको UTF-32 की आवश्यकता होती है, क्योंकि UTF-16 अभी भी परिवर्तनशील लंबाई है। यदि आपको इसकी आवश्यकता नहीं है, तो UTF-16, UTF-8 की तुलना में अंतरिक्ष के विशाल अपशिष्ट की तरह लगता है। UTF-8 और UTF-32 के ऊपर UTF-16 के क्या फायदे हैं और Windows और Java इसे अपने मूल एन्कोडिंग के रूप में क्यों उपयोग करते हैं?


UTF-16 सभी बुनियादी बहुभाषी विमान (BMP) को एकल कोड इकाइयों के रूप में प्रतिनिधित्व करने की अनुमति देता है। यू + एफएफएफ से परे यूनिकोड कोड अंक सरोगेट जोड़े द्वारा दर्शाए गए हैं।

दिलचस्प बात यह है कि जावा और विंडोज (और अन्य सिस्टम जो यूटीएफ -16 का उपयोग करते हैं) सभी कोड इकाई स्तर पर काम करते हैं, न कि यूनिकोड कोड बिंदु स्तर पर। तो एकल वर्ण U + 1D122 (MUSICAL SYMBOL F CLEF) से युक्त स्ट्रिंग जावा में "\ ud824 \ udd22" और "\ud824\udd22".length() == 2 ( 1 नहीं) के रूप में एनकोड हो जाती है। तो यह एक हैक की तरह है, लेकिन यह पता चला है कि वर्ण चर लंबाई नहीं हैं।

UTF-8 पर UTF-16 का लाभ यह है कि यदि UTF-8 के साथ एक ही हैक का उपयोग किया जाता है, तो बहुत अधिक छोड़ देगा।


UTF16 का उपयोग आम तौर पर मल्टी-बाइट कैरेक्टर सेटों के लिए प्रत्यक्ष मैपिंग के रूप में किया जाता है, अर्थात ओरिजिनल 0-0xFFFF अक्षर निर्दिष्ट किए जाते हैं।

यह आपको दोनों दुनियाओं में सर्वश्रेष्ठ देता है, आपके पास चरित्र का आकार निर्धारित है लेकिन फिर भी सभी वर्णों को प्रिंट कर सकते हैं किसी को भी उपयोग करने की संभावना है (रूढ़िवादी क्लिंगन धार्मिक लिपियों को छोड़कर)


जब Windows NT को डिज़ाइन किया गया था UTF-16 मौजूद नहीं था (NT 3.51 का जन्म 1993 में हुआ था, जबकि UTF-16 का जन्म 1996 में यूनिकोड 2.0 मानक के साथ हुआ था); इसके बजाय UCS-2 था, जो उस समय, यूनिकोड में उपलब्ध प्रत्येक वर्ण को धारण करने के लिए पर्याप्त था, इसलिए 1 कोड पॉइंट = 1 कोड यूनिट समतुल्यता वास्तव में सच थी - स्ट्रिंग्स के लिए किसी भी चर-लंबाई तर्क की आवश्यकता नहीं थी।

वे पूरे यूनिकोड वर्ण सेट का समर्थन करने के लिए बाद में UTF-16 में चले गए; हालाँकि, वे UTF-8 या UTF-32 में नहीं जा सकते हैं, क्योंकि इससे API इंटरफ़ेस (अन्य चीजों के बीच) में द्विआधारी संगतता टूट जाएगी।

जावा के लिए, मैं वास्तव में निश्चित नहीं हूं; चूंकि यह 1995 में जारी किया गया था, मुझे संदेह है कि UTF-16 पहले से ही हवा में था (भले ही इसे अभी तक मानकीकृत नहीं किया गया था), लेकिन मुझे लगता है कि NT- आधारित ऑपरेटिंग सिस्टम के साथ संगतता ने उनकी पसंद में कुछ भूमिका निभाई होगी (निरंतर UTF-8 <-> UTF-16 विंडोज एपीआई के लिए हर कॉल के लिए रूपांतरण कुछ मंदी का परिचय दे सकता है)।

संपादित करें

विकिपीडिया बताता है कि जावा के लिए भी यह उसी तरह से चला गया: यह मूल रूप से UCS-2 का समर्थन करता था, लेकिन J2-5.0 में UTF-16 में चला गया।

इसलिए, सामान्य तौर पर जब आप UTF-16 को कुछ API / फ्रेमवर्क में उपयोग करते हुए देखते हैं, तो यह इसलिए है क्योंकि यह UCS-2 (स्ट्रिंग-प्रबंधन एल्गोरिदम में जटिलताओं से बचने के लिए) के रूप में शुरू हुआ था, लेकिन यह कोड अंक का समर्थन करने के लिए UTF-16 में चला गया बीएमपी, अभी भी एक ही कोड इकाई के आकार को बनाए रखता है।





utf-32