जवाबों:
मेरा मानना है कि वेब के आसपास इस बारे में बहुत सारे अच्छे लेख हैं, लेकिन यहां एक संक्षिप्त सारांश है।
UTF-8 और UTF-16 दोनों ही चर लंबाई के एनकोडिंग हैं। हालांकि, UTF-8 में एक चरित्र न्यूनतम 8 बिट्स पर कब्जा कर सकता है, जबकि UTF-16 में चरित्र की लंबाई 16 बिट्स के साथ शुरू होती है।
मुख्य UTF-8 पेशेवरों:
मुख्य UTF-8 विपक्ष:
मुख्य UTF-16 पेशेवरों:
char
स्ट्रिंग के आदिम घटक के रूप में 16-बिट का उपयोग करने की अनुमति देता है ।मुख्य UTF-16 विपक्ष:
सामान्य तौर पर, यूटीएफ -16 आमतौर पर इन-मेमोरी प्रतिनिधित्व के लिए बेहतर होता है क्योंकि बीई / एल वहां अप्रासंगिक होता है (बस मूल आदेश का उपयोग करें) और अनुक्रमण तेज है (बस सरोगेट जोड़े को ठीक से संभालना मत भूलना)। दूसरी ओर UTF-8, टेक्स्ट फ़ाइलों और नेटवर्क प्रोटोकॉल के लिए बहुत अच्छा है क्योंकि कोई BE / LE समस्या नहीं है और अशक्तता अक्सर काम में आती है, साथ ही ASCII- अनुकूलता भी।
वे यूनिकोड वर्णों का प्रतिनिधित्व करने के लिए बस अलग-अलग योजनाएं हैं।
दोनों चर-लंबाई हैं - UTF-16 मूल बहुभाषी विमान (BMP) में सभी वर्णों के लिए 2 बाइट्स का उपयोग करता है जिसमें अधिकांश वर्ण सामान्य उपयोग में होते हैं।
यूएफएफ -8 बीएमपी में पात्रों के लिए 1 और 3 बाइट्स के बीच का उपयोग करता है, यू + 0000 से यू + 1 एफएफएफएफ की वर्तमान यूनिकोड रेंज में पात्रों के लिए 4 तक, और यू + 7 एफएफएफएफएफ तक एक्स्टेंसिबल है यदि कभी आवश्यक हो जाता है ... लेकिन विशेष रूप से सभी ASCII पात्रों को एक ही बाइट में दर्शाया गया है।
किसी संदेश को पचाने के उद्देश्य से यह मायने नहीं रखेगा कि आप इनमें से किसको चुनते हैं, इसलिए जब तक हर कोई पाचन को फिर से बनाने की कोशिश करता है एक ही विकल्प का उपयोग करता है।
UTF-8 और Unicode के बारे में अधिक जानने के लिए यह पृष्ठ देखें ।
(ध्यान दें कि सभी जावा वर्ण BMP के भीतर UTF-16 कोड बिंदु हैं, U + FFFF से ऊपर के वर्णों का प्रतिनिधित्व करने के लिए आपको जावा में सरोगेट जोड़े का उपयोग करने की आवश्यकता है।)
UTF-8 और UTF-16 के बीच अंतर? हमें इनकी आवश्यकता क्यों है?
UTF-16 के कार्यान्वयन में कम से कम कुछ सुरक्षा कमजोरियां रही हैं । देखें जानकारी के लिए विकिपीडिया ।
WHATWG और W3C ने अब घोषित किया है कि वेब पर केवल UTF-8 का उपयोग किया जाना है।
[सुरक्षा] समस्याएँ यहाँ बताई गई हैं, विशेष रूप से UTF-8 का उपयोग करते समय दूर हो जाती हैं, जो कई कारणों में से एक है जो अब सभी चीजों के लिए अनिवार्य एन्कोडिंग है।
अन्य समूह भी यही कह रहे हैं।
यूटीएफ -16 को कुछ प्रणालियों जैसे कि जावा और विंडोज द्वारा आंतरिक रूप से उपयोग किए जाने के दौरान जारी रखा जा सकता है, जबकि यूटीएफ -16 का थोड़ा-बहुत उपयोग आपने डेटा फ़ाइलों, डेटा एक्सचेंज और इस तरह के अतीत में देखा होगा, संभवतः पूरी तरह से फीका हो जाएगा।
यह UTF-8/16 (सामान्य रूप से असंबंधित है, हालांकि यह UTF16 में परिवर्तित हो जाता है और BE / LE भाग को w / एक लाइन सेट किया जा सकता है), फिर भी नीचे स्ट्रिंग को बाइट में बदलने का सबसे तेज़ तरीका है []। उदाहरण के लिए: प्रदान किए गए मामले (हैश कोड) के लिए अच्छा है। String.getBytes (एन्को) अपेक्षाकृत धीमा है।
static byte[] toBytes(String s){
byte[] b=new byte[s.length()*2];
ByteBuffer.wrap(b).asCharBuffer().put(s);
return b;
}
UTF-8 और UTF-16 को अलग करने का सरल तरीका उनके बीच की सामान्यताओं की पहचान करना है।
दिए गए चरित्र के लिए एक ही यूनिकोड नंबर साझा करने के अलावा, हर एक का अपना प्रारूप है।