java - यूटीएफ-8 और यूटीएफ-16 के बीच अंतर?




unicode utf-8 (3)

यूटीएफ -8 और यूटीएफ -16 के बीच अंतर? हमें इनकी आवश्यकता क्यों है?

MessageDigest md = MessageDigest.getInstance("SHA-256");
String text = "This is some text";

md.update(text.getBytes("UTF-8")); // Change this to "UTF-16" if needed
byte[] digest = md.digest();

मेरा मानना ​​है कि वेब के आसपास इस बारे में बहुत सारे अच्छे लेख हैं, लेकिन यहां एक संक्षिप्त सारांश है।

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

मुख्य यूटीएफ -8 पेशेवर:

  • अंक जैसे मूल ASCII वर्ण, कोई उच्चारण वाले लैटिन वर्ण इत्यादि। एक बाइट पर कब्जा करते हैं जो यूएस-एएससीआईआईआई प्रतिनिधित्व के समान है। इस तरह सभी यूएस-एएससीआईआई स्ट्रिंग वैध यूटीएफ -8 बन जाते हैं, जो कई मामलों में सभ्य पिछड़ा संगतता प्रदान करता है।
  • कोई शून्य बाइट्स, जो नल-टर्मिनेटेड तारों का उपयोग करने की अनुमति देता है, यह भी पीछे की संगतता का एक बड़ा सौदा पेश करता है।
  • यूटीएफ -8 बाइट ऑर्डर से स्वतंत्र है, इसलिए आपको बिग एंडियन / लिटिल एंडियन मुद्दे के बारे में चिंता करने की ज़रूरत नहीं है।

मुख्य यूटीएफ -8 विपक्ष:

  • कई आम पात्रों की अलग-अलग लंबाई होती है, जो कोडपॉइंट द्वारा अनुक्रमणित करता है और कोडपॉइंट गिनती की गणना करता है।
  • हालांकि बाइट ऑर्डर कोई फर्क नहीं पड़ता है, फिर भी कभी-कभी यूटीएफ -8 में बीओएम (बाइट ऑर्डर मार्क) होता है जो यह सूचित करता है कि पाठ यूटीएफ -8 में एन्कोड किया गया है, और एएससीआईआई सॉफ्टवेयर के साथ संगतता भी तोड़ता है भले ही पाठ में केवल ASCII वर्ण हों । माइक्रोसॉफ्ट सॉफ्टवेयर (नोटपैड की तरह) विशेष रूप से बीओएम को यूटीएफ -8 में जोड़ना पसंद करता है।

मुख्य यूटीएफ -16 पेशेवर:

  • बीएमपी (मूल बहुभाषी विमान) पात्र, लैटिन, सिरिलिक, अधिकांश चीनी (पीआरसी ने बीएमपी अनिवार्य के बाहर कुछ कोडपॉइंट्स के लिए समर्थन दिया), अधिकांश जापानी को 2 बाइट्स के साथ प्रदर्शित किया जा सकता है। पाठ में अनुपूरक वर्ण नहीं होने पर यह इंडेक्सिंग और कोडपॉइंट गिनती की गणना करता है।
  • यहां तक ​​कि यदि पाठ में पूरक वर्ण हैं, फिर भी वे 16-बिट मानों के जोड़े द्वारा दर्शाए जाते हैं, जिसका अर्थ है कि कुल लंबाई अभी भी दो से विभाजित है और स्ट्रिंग के आदिम घटक के रूप में 16-बिट char का उपयोग करने की अनुमति देती है।

मुख्य यूटीएफ -16 विपक्ष:

  • यूएस-एएससीआईआई स्ट्रिंग्स में बहुत सारे नल बाइट्स, जिसका मतलब है कि कोई शून्य-समाप्त तार नहीं है और बहुत सारी बर्बादी वाली स्मृति है।
  • कई सामान्य परिदृश्यों (विशेष रूप से यूएस / ईयू / साइरिलिक अल्फाबेट्स / इज़राइल / अरब देशों / ईरान और कई अन्य देशों वाले देशों) में एक निश्चित-लंबाई एन्कोडिंग "ज्यादातर काम करता है" के रूप में इसका उपयोग करते हुए, अक्सर टूटा समर्थन होता है जहां यह नहीं होता है। इसका मतलब है कि प्रोग्रामर को सरोगेट जोड़े से अवगत होना चाहिए और उन मामलों में उन्हें ठीक से संभालना होगा जहां यह महत्वपूर्ण है!
  • यह परिवर्तनीय लंबाई है, इसलिए कोडपॉइंट्स को गिनती या अनुक्रमण करना महंगा है, हालांकि यूटीएफ -8 से कम है।

आम तौर पर, यूटीएफ -16 आमतौर पर इन-मेमोरी प्रतिनिधित्व के लिए बेहतर होता है क्योंकि बीई / लीई अप्रासंगिक है (केवल मूल क्रम का उपयोग करें) और अनुक्रमण तेजी से है (बस सरोगेट जोड़े को सही तरीके से संभालना न भूलें)। दूसरी तरफ, यूटीएफ -8, पाठ फ़ाइलों और नेटवर्क प्रोटोकॉल के लिए बेहद अच्छा है क्योंकि कोई बीई / ली मुद्दा नहीं है और निरंतर समाप्ति अक्सर काम में आती है, साथ ही एएससीआईआईआई-संगतता भी होती है।


यह यूटीएफ -8 / 16 से संबंधित नहीं है (सामान्य रूप से, हालांकि यह यूटीएफ 16 में परिवर्तित होता है और बीई / ली भाग को एक लाइन को सेट किया जा सकता है), फिर भी स्ट्रिंग को बाइट [] में परिवर्तित करने का सबसे तेज़ तरीका नीचे दिया गया है। उदाहरण के लिए: प्रदान किए गए मामले के लिए बिल्कुल सही (हैश कोड)। String.getBytes (enc) अपेक्षाकृत धीमी है।

static byte[] toBytes(String s){
        byte[] b=new byte[s.length()*2];
        ByteBuffer.wrap(b).asCharBuffer().put(s);
        return b;
    }

वे यूनिकोड वर्णों का प्रतिनिधित्व करने के लिए बस अलग-अलग योजनाएं हैं।

दोनों चर-लंबाई हैं - यूटीएफ -16 बुनियादी बहुभाषी विमान (बीएमपी) के सभी पात्रों के लिए 2 बाइट्स का उपयोग करता है जिसमें सामान्य उपयोग में अधिकांश वर्ण होते हैं।

यूटीएफ -8 बीएमपी के पात्रों के लिए 1 और 3 बाइट्स के बीच उपयोग करता है, यू +0000 से यू + 1 एफएफएफएफएफ की वर्तमान यूनिकोड रेंज में वर्णों के लिए 4 तक, और यदि यह कभी भी आवश्यक हो तो यू +7 एफएफएफएफएफएफएफ तक एक्स्टेंसिबल है ... लेकिन विशेष रूप से सभी ASCII वर्णों को प्रत्येक बाइट में दर्शाया जाता है।

संदेश पचाने के प्रयोजनों के लिए इससे कोई फर्क नहीं पड़ता कि आप इनमें से कौन सा चुनते हैं, जब तक कि पाचन को फिर से बनाने की कोशिश करने वाले हर कोई एक ही विकल्प का उपयोग करता है।

यूटीएफ -8 और यूनिकोड के बारे में अधिक जानकारी के लिए यह पृष्ठ देखें।

(ध्यान दें कि सभी जावा वर्ण बीएमपी के भीतर यूटीएफ -16 कोड बिंदु हैं; यू + एफएफएफएफ के ऊपर वर्णों का प्रतिनिधित्व करने के लिए आपको जावा में सरोगेट जोड़े का उपयोग करने की आवश्यकता है।)





utf