unicode - यूटीएफ-8, यूटीएफ-16, और यूटीएफ-32




utf-8 utf-16 (8)

UTF-8

  • बाइट ऑर्डर की कोई अवधारणा नहीं है
  • प्रति चरित्र 1 और 4 बाइट्स के बीच उपयोग करता है
  • एएससीआईआई एन्कोडिंग का एक संगत सबसेट है
  • पूरी तरह से आत्म-सिंक्रनाइज़िंग जैसे स्ट्रीम में कहीं से भी एक बाइट बाइट अधिकांश एकल चरित्र में भ्रष्ट हो जाएगा
  • बहुत अधिक यूरोपीय भाषाओं को दो बाइट्स या प्रति चरित्र कम में एन्कोड किया गया है

UTF-16

  • ज्ञात बाइट ऑर्डर के साथ पार्स किया जाना चाहिए या बाइट ऑर्डर-मार्क (बीओएम) पढ़ना चाहिए
  • प्रति चरित्र 2 या 4 बाइट्स का उपयोग करता है

UTF-32

  • हर चरित्र 4 बाइट्स है
  • ज्ञात बाइट ऑर्डर के साथ पार्स किया जाना चाहिए या बाइट ऑर्डर-मार्क (बीओएम) पढ़ना चाहिए

यूटीएफ -8 सबसे अधिक अंतरिक्ष कुशल होने जा रहा है जब तक कि अधिकांश पात्र सीजेके (चीनी, जापानी, और कोरियाई) चरित्र स्थान से न हों।

यूटीएफ -32 एक बाइट-सरणी में चरित्र ऑफसेट द्वारा यादृच्छिक पहुंच के लिए सबसे अच्छा है।

यूटीएफ -8, यूटीएफ -16, और यूटीएफ -32 के बीच अंतर क्या हैं?

मैं समझता हूं कि वे सभी यूनिकोड स्टोर करेंगे, और प्रत्येक एक चरित्र का प्रतिनिधित्व करने के लिए बाइट्स की एक अलग संख्या का उपयोग करता है। क्या एक दूसरे को चुनने का कोई फायदा है?


आपके विकास के माहौल के आधार पर आपके पास विकल्प भी नहीं हो सकता है कि आपके स्ट्रिंग डेटा प्रकार को एन्कोडिंग आंतरिक रूप से उपयोग करेगी।

लेकिन यदि आपके पास विकल्प है तो मैं डेटा संग्रह और विनिमय के लिए हमेशा यूटीएफ -8 का उपयोग करता हूं। यदि आपके पास अधिकतर एएससीआईआई डेटा है तो यह आपको हस्तांतरण के लिए डेटा की सबसे छोटी राशि देगा, जबकि अभी भी सब कुछ एन्कोड करने में सक्षम है। कम से कम I / O के लिए अनुकूलित करना आधुनिक मशीनों पर जाने का तरीका है।


मैंने MySQL में यूटीएफ -8 और यूटीएफ -16 के बीच डेटाबेस प्रदर्शन की तुलना करने के लिए कुछ परीक्षण किए।

अद्यतन गति

UTF-8

UTF-16

गति डालें

गति हटाएं


मैंने अपने blogpost में एक सरल स्पष्टीकरण देने की कोशिश की।

UTF-32

किसी भी चरित्र को एन्कोड करने के लिए 32 बिट्स (4 बाइट्स) की आवश्यकता होती है। उदाहरण के लिए, इस योजना का उपयोग करके "ए" वर्ण कोड-बिंदु का प्रतिनिधित्व करने के लिए, आपको 32-बिट बाइनरी संख्या में 65 लिखना होगा:

00000000 00000000 00000000 01000001 (Big Endian)

यदि आप एक नजदीकी नजर रखते हैं, तो आप ध्यान दें कि ASCII योजना का उपयोग करते समय सबसे सही सात बिट वास्तव में एक ही बिट्स हैं। लेकिन चूंकि यूटीएफ -32 निश्चित चौड़ाई योजना है , इसलिए हमें तीन अतिरिक्त बाइट संलग्न करना होगा। मतलब यह है कि यदि हमारे पास दो फाइलें हैं जिनमें केवल "ए" वर्ण है, तो एक ASCII-एन्कोडेड है और दूसरा यूटीएफ -32 एन्कोडेड है, उनका आकार 1 बाइट और 4 बाइट्स संगत रूप से होगा।

UTF-16

बहुत से लोग सोचते हैं कि यूटीएफ -32 कोड-पॉइंट का प्रतिनिधित्व करने के लिए निश्चित चौड़ाई 32 बिट का उपयोग करता है, यूटीएफ -16 निश्चित चौड़ाई 16 बिट्स है। गलत!

यूटीएफ -16 में कोड पॉइंट शायद 16 बिट्स या 32 बिट्स में प्रदर्शित होता है। तो यह योजना परिवर्तनीय लंबाई एन्कोडिंग प्रणाली है। यूटीएफ -32 पर क्या फायदा है? कम से कम ASCII के लिए, फ़ाइलों का आकार मूल 4 गुणा (लेकिन फिर भी दो बार) नहीं होगा, इसलिए हम अभी भी ASCII पिछड़े संगत नहीं हैं।

चूंकि 7-बिट "ए" चरित्र का प्रतिनिधित्व करने के लिए पर्याप्त हैं, इसलिए अब हम यूटीएफ -32 की तरह 4 की बजाय 2 बाइट्स का उपयोग कर सकते हैं। यह इस तरह दिखेगा:

00000000 01000001

UTF-8

आपने सही अनुमान लगाया है .. यूटीएफ -8 में कोड बिंदु शायद 32, 16, 24 या 8 बिट्स का उपयोग करके प्रतिनिधित्व किया जा सकता है, और यूटीएफ -16 सिस्टम के रूप में, यह भी परिवर्तनीय लंबाई एन्कोडिंग सिस्टम है।

आखिरकार हम एसीसीआईआई एन्कोडिंग सिस्टम का उपयोग करके इसका प्रतिनिधित्व करते हुए "ए" का प्रतिनिधित्व कर सकते हैं:

01001101

एक छोटा सा उदाहरण जहां यूटीएफ -16 वास्तव में यूटीएफ -8 से बेहतर है:

चीनी पत्र "語" पर विचार करें - इसकी यूटीएफ -8 एन्कोडिंग है:

11101000 10101010 10011110

जबकि इसकी यूटीएफ -16 एन्कोडिंग कम है:

10001010 10011110

प्रतिनिधित्व को समझने के लिए और इसका अर्थ कैसे समझा जाता है, मूल पोस्ट पर जाएं।


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

यूटीएफ -16 बेहतर है जहां एएससीआईआई प्रमुख नहीं है, क्योंकि यह प्रति चरित्र 2 बाइट्स का उपयोग करता है, मुख्य रूप से। यूटीएफ -8 उच्च ऑर्डर अक्षरों के लिए 3 या अधिक बाइट्स का उपयोग शुरू कर देगा जहां यूटीएफ -16 अधिकांश पात्रों के लिए केवल 2 बाइट्स पर रहता है।

यूटीएफ -32 4 बाइट्स में सभी संभावित पात्रों को कवर करेगा। यह इसे बहुत फूला हुआ बनाता है। मैं इसका उपयोग करने के किसी भी लाभ के बारे में नहीं सोच सकता।


यूनिकोड एक विशाल वर्ण सेट को परिभाषित करता है, जो प्रत्येक ग्राफिकल प्रतीक के लिए एक अद्वितीय पूर्णांक मान निर्दिष्ट करता है (यह एक प्रमुख सरलीकरण है, और वास्तव में सत्य नहीं है, लेकिन यह इस प्रश्न के प्रयोजनों के लिए पर्याप्त है)। यूटीएफ -8 / 16/32 इसे एन्कोड करने के लिए बस अलग-अलग तरीके हैं।

संक्षेप में, यूटीएफ -32 प्रत्येक चरित्र के लिए 32-बिट मानों का उपयोग करता है। इससे उन्हें प्रत्येक चरित्र के लिए एक निश्चित-चौड़ाई कोड का उपयोग करने की अनुमति मिलती है।

यूटीएफ -16 डिफ़ॉल्ट रूप से 16-बिट का उपयोग करता है, लेकिन यह आपको केवल 65k संभावित वर्ण देता है, जो पूर्ण यूनिकोड सेट के लिए कहीं भी पर्याप्त नहीं है। तो कुछ वर्ण 16-बिट मानों के जोड़े का उपयोग करते हैं।

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

और यह हमें फायदे की ओर ले जाता है। कोई भी ASCII-character यूटीएफ -8 के साथ सीधे संगत है, इसलिए विरासत ऐप्स को अपग्रेड करने के लिए, यूटीएफ -8 एक आम और स्पष्ट पसंद है। लगभग सभी मामलों में, यह कम से कम स्मृति का भी उपयोग करेगा। दूसरी ओर, आप किसी चरित्र की चौड़ाई के बारे में कोई गारंटी नहीं दे सकते। यह 1, 2, 3 या 4 वर्ण चौड़ा हो सकता है, जो स्ट्रिंग हेरफेर को मुश्किल बनाता है।

यूटीएफ -32 विपरीत है, यह सबसे अधिक स्मृति का उपयोग करता है (प्रत्येक वर्ण एक निश्चित 4 बाइट चौड़ा है), लेकिन दूसरी तरफ, आप जानते हैं कि प्रत्येक चरित्र में यह सटीक लंबाई होती है, इसलिए स्ट्रिंग मैनिपुलेशन बहुत आसान हो जाता है। आप केवल स्ट्रिंग के बाइट्स की लंबाई से स्ट्रिंग में वर्णों की संख्या की गणना कर सकते हैं। आप यूटीएफ -8 के साथ ऐसा नहीं कर सकते हैं।

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

आखिरकार, मंच के समर्थन के साथ बस जाना अक्सर सहायक होता है। विंडोज़ आंतरिक रूप से यूटीएफ -16 का उपयोग करता है, इसलिए विंडोज़ पर, यह स्पष्ट विकल्प है।

लिनक्स थोड़ा भिन्न होता है, लेकिन वे आम तौर पर यूनिकोड-अनुरूप के लिए यूटीएफ -8 का उपयोग करते हैं।

तो संक्षिप्त उत्तर: सभी तीन एन्कोडिंग एक ही चरित्र सेट को एन्कोड कर सकते हैं, लेकिन वे प्रत्येक चरित्र को विभिन्न बाइट अनुक्रमों के रूप में दर्शाते हैं।


संक्षेप में:

  • यूटीएफ -8: वेरिएबल-चौड़ाई एन्कोडिंग, ASCII के साथ पीछे संगत। ASCII वर्ण (यू +0000 से यू +007 एफ) 1 बाइट लेते हैं, कोड पॉइंट यू +0080 यू + 07 एफएफ में 2 बाइट्स लेते हैं, कोड पॉइंट यू + 0800 यू + एफएफएफएफ में 3 बाइट्स लेते हैं, कोड पॉइंट यू + 10000 यू + 10 एफएफएफएफ 4 बाइट्स ले लो। अंग्रेजी पाठ के लिए अच्छा, एशियाई पाठ के लिए इतना अच्छा नहीं है।
  • यूटीएफ -16: परिवर्तनीय-चौड़ाई एन्कोडिंग। कोड पॉइंट यू +0000 से यू + एफएफएफएफ में 2 बाइट्स लेते हैं, कोड पॉइंट यू + 10000 यू +10 एफएफएफएफ में 4 बाइट्स लेते हैं। अंग्रेजी पाठ के लिए बुरा, एशियाई पाठ के लिए अच्छा है।
  • यूटीएफ -32: फिक्स्ड-चौड़ाई एन्कोडिंग। सभी कोड अंक चार बाइट लेते हैं। एक विशाल स्मृति हॉग, लेकिन काम करने के लिए तेजी से। बहुत कम प्रयुक्त।

लंबे समय तक: विकिपीडिया: UTF-8 , UTF-16 , और UTF-32


यूनिकोड एक मानक और यूटीएफ-एक्स है जो आप कुछ व्यावहारिक उद्देश्यों के लिए तकनीकी कार्यान्वयन के रूप में सोच सकते हैं:

  • यूटीएफ -8 - " आकार अनुकूलित ": लैटिन चरित्र आधारित डेटा (या एएससीआईआईआई) के लिए सबसे उपयुक्त है, यह प्रति चरित्र केवल 1 बाइट लेता है लेकिन आकार के अनुसार प्रतीक विविधता बढ़ती है (और सबसे खराब स्थिति प्रति चरित्र 6 बाइट तक बढ़ सकती है)
  • यूटीएफ -16 - " बैलेंस ": इसमें प्रति चरित्र न्यूनतम 2 बाइट्स लेते हैं जो कि मुख्यधारा की भाषाओं के मौजूदा सेट के लिए पर्याप्त है जिसमें चरित्र हैंडलिंग को कम करने के लिए निश्चित आकार होता है (लेकिन आकार अभी भी परिवर्तनीय है और प्रति चरित्र 4 बाइट तक बढ़ सकता है )
  • यूटीएफ -32 - " प्रदर्शन ": निश्चित आकार वर्णों (4 बाइट्स) के परिणामस्वरूप सरल एल्गोरिदम का उपयोग करने की अनुमति देता है लेकिन स्मृति हानि के साथ




utf-32