unicode - यूटीएफ-8 और यूनिकोड के बीच क्या अंतर है
encoding utf-8 (9)
मैंने लोगों से विवादित राय सुनी है - विकिपीडिया के अनुसार, यहां देखें ।
वे एक ही बात हैं, है ना? क्या कोई स्पष्टीकरण दे सकता है?
वे एक ही बात हैं, है ना?
नहीं, वे नहीं हैं।
मुझे लगता है कि आपके द्वारा संदर्भित विकिपीडिया पेज की पहली वाक्य एक अच्छा, संक्षिप्त सारांश देता है:
यूटीएफ -8 एक परिवर्तनीय चौड़ाई वर्ण एन्कोडिंग है जो यूनिकोड में एक से चार 8-बिट बाइट्स का उपयोग करके सभी 1,112,064 मान्य कोड बिंदुओं को एन्कोड करने में सक्षम है।
समझाने के लिए:
यूनिकोड एक मानक है, जो अक्षरों से संख्याओं के लिए मानचित्र को परिभाषित करता है, तथाकथित कोड बिंदु , (नीचे दिए गए उदाहरण में)। पूर्ण मैपिंग के लिए, आप here एक नज़र डाल सकते हैं।
! -> U+0021 (21), " -> U+0022 (22), \# -> U+0023 (23)
यूटीएफ -8 इन कोड बिंदुओं को एक रूप में एन्कोड करने के तरीकों में से एक है जिसे कंप्यूटर समझ सकता है, उर्फ बिट्स । दूसरे शब्दों में, यह उन कोड बिंदुओं को बिट्स के अनुक्रम में परिवर्तित करने के लिए एक तरीका / एल्गोरिदम है या बिट्स के अनुक्रम को समकक्ष कोड बिंदुओं में परिवर्तित करता है। ध्यान दें कि यूनिकोड के लिए कई वैकल्पिक एन्कोडिंग हैं।
जोएल यहां वास्तव में एक अच्छा स्पष्टीकरण और इतिहास का एक सिंहावलोकन देता here ।
1. यूनिकोड
दुनिया भर के कई पात्र हैं, जैसे "$, &, एच, ए, टी,?, 张, 1, =, + ..."।
फिर एक संगठन आता है जो इन पात्रों को समर्पित है,
उन्होंने "यूनिकोड" नामक एक मानक बनाया।
मानक निम्नानुसार है:
- एक फॉर्म बनाएं जिसमें प्रत्येक स्थिति को "कोड पॉइंट" या "कोड स्थिति" कहा जाता है।
- पूरी स्थिति यू +0000 से यू +10 एफएफएफएफ तक है;
- अब तक, कुछ पद पात्रों से भरे हुए हैं, और अन्य स्थितियां सहेजी गई हैं या खाली हैं।
- उदाहरण के लिए, "यू +0024" स्थिति "$" चरित्र से भरी है।
पीएस: बेशक एक और संगठन है जिसे आईएसओ नामक एक और मानक बनाए रखा जाता है - "आईएसओ 10646", लगभग वही।
2. यूटीएफ -8
उपर्युक्त के रूप में, यू +0024 सिर्फ एक स्थिति है, इसलिए हम "$" चरित्र के लिए कंप्यूटर में "यू +0024" को सहेज नहीं सकते हैं।
एक एन्कोडिंग विधि होनी चाहिए।
फिर यूटीएफ -8, यूटीएफ -16, यूटीएफ -32, यूसीएस -2 जैसे एन्कोडिंग विधियां आती हैं ....
यूटीएफ -8 के तहत, कोड बिंदु "यू +0024" 00100100 में एन्कोड किया गया है।
00100100 वह मान है जिसे हम कंप्यूटर में "$" के लिए सहेजते हैं।
मुझे इस विषय को चित्रित करने के लिए एक उदाहरण का उपयोग करने दें:
A chinese character: 汉
it's unicode value: U+6C49
convert 6C49 to binary: 01101100 01001001
अभी तक कुछ भी जादुई नहीं है, यह बहुत आसान है। अब, मान लीजिए कि हम इस चरित्र को हमारी हार्ड ड्राइव पर स्टोर करने का फैसला करते हैं। ऐसा करने के लिए, हमें चरित्र को बाइनरी प्रारूप में स्टोर करने की आवश्यकता है। हम इसे '01101100 01001001' के रूप में स्टोर कर सकते हैं। किया हुआ!
लेकिन एक मिनट प्रतीक्षा करें, '01101100 01001001' एक चरित्र या दो अक्षर है? आप जानते थे कि यह एक चरित्र है क्योंकि मैंने आपको बताया था, लेकिन जब कोई कंप्यूटर इसे पढ़ता है, तो उसे कोई जानकारी नहीं है। तो कंप्यूटर को इसे एक के रूप में पेश करने के लिए हमें कुछ प्रकार के "एन्कोडिंग" की आवश्यकता है।
यही वह जगह है जहां 'यूटीएफ -8' के नियम आते हैं: http://www.fileformat.info/info/unicode/utf8.htm
Binary format of bytes in sequence
1st Byte 2nd Byte 3rd Byte 4th Byte Number of Free Bits Maximum Expressible Unicode Value
0xxxxxxx 7 007F hex (127)
110xxxxx 10xxxxxx (5+6)=11 07FF hex (2047)
1110xxxx 10xxxxxx 10xxxxxx (4+6+6)=16 FFFF hex (65535)
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx (3+6+6+6)=21 10FFFF hex (1,114,111)
उपर्युक्त तालिका के मुताबिक, अगर हम 'यूटीएफ -8' प्रारूप का उपयोग करके इस चरित्र को स्टोर करना चाहते हैं, तो हमें अपने चरित्र को 'हेडर' के साथ उपसर्ग करना होगा। हमारा चीनी चरित्र 16 बिट लंबा है (बाइनरी मान स्वयं को गिनें), इसलिए हम पंक्ति 3 पर प्रारूप का उपयोग करेंगे क्योंकि यह पर्याप्त स्थान प्रदान करता है:
Header Place holder Fill in our Binary Result
1110 xxxx 0110 11100110
10 xxxxxx 110001 10110001
10 xxxxxx 001001 10001001
परिणाम को एक पंक्ति में लिखना:
11100110 10110001 10001001
यह चीनी चरित्र का यूटीएफ -8 (बाइनरी) मान है! (इसे स्वयं पुष्टि करें: http://www.fileformat.info/info/unicode/char/6c49/index.htm )
सारांश
A chinese character: 汉
it's unicode value: U+6C49
convert 6C49 to binary: 01101100 01001001
embed 6C49 as UTF-8: 11100110 10110001 10001001
मैंने गम्बो के जवाब में लिंक की जांच की है, और मैं स्टैक ओवरफ्लो पर मौजूद उन चीज़ों के कुछ हिस्सों को पेस्ट करना चाहता हूं।
"... कुछ लोग गलत धारणा के तहत हैं कि यूनिकोड बस 16-बिट कोड है जहां प्रत्येक चरित्र 16 बिट लेता है और इसलिए 65,536 संभावित पात्र हैं। यह वास्तव में सही नहीं है। यह यूनिकोड के बारे में सबसे आम मिथक है , तो अगर आपने सोचा, तो बुरा मत मानो।
वास्तव में, यूनिकोड के पात्रों के बारे में सोचने का एक अलग तरीका है, और आपको चीजों के बारे में सोचने के यूनिकोड तरीके को समझना होगा या कुछ भी समझ में नहीं आता है।
अब तक, हमने माना है कि डिस्क पर या स्मृति में स्टोर करने वाले कुछ बिट्स के लिए एक पत्र मैप्स:
ए -> 0100 0001
यूनिकोड में, एक पत्र बिंदु को कोड बिंदु कहा जाता है जो अभी भी एक सैद्धांतिक अवधारणा है। स्मृति या डिस्क पर उस कोड बिंदु का प्रतिनिधित्व कैसे किया जाता है एक पूरी कहानी है ... "
"... प्रत्येक वर्णमाला में प्रत्येक प्लैटोनिक पत्र को यूनिकोड कंसोर्टियम द्वारा एक जादू संख्या सौंपी जाती है जो इस तरह लिखा जाता है: यू + 0639। इस जादू संख्या को कोड बिंदु कहा जाता है। यू + का अर्थ है" यूनिकोड "और संख्या हेक्साडेसिमल हैं। यू + 0639 अरबी अक्षर ऐन है। अंग्रेजी पत्र ए यू + 0041 होगा .... "
"... ठीक है, तो कहें कि हमारे पास एक स्ट्रिंग है:
नमस्ते
जो, यूनिकोड में, इन पांच कोड बिंदुओं से मेल खाता है:
यू +0048 यू +0065 यू +006 सी यू +006 सी यू +006 एफ।
कोड बिंदुओं का बस एक गुच्छा। संख्या, वास्तव में। हमने अभी तक स्मृति में इसे स्टोर करने या ईमेल संदेश में इसका प्रतिनिधित्व करने के बारे में कुछ भी नहीं कहा है ... "
"... वह जगह है जहां एन्कोडिंग आती है।
यूनिकोड एन्कोडिंग के लिए सबसे शुरुआती विचार, जिसने दो बाइट्स के बारे में मिथक का नेतृत्व किया, हे, चलो बस उन नंबरों को दो बाइट्स में स्टोर करें। तो हैलो बन जाता है
00 48 00 65 00 6 सी 00 6 सी 00 6 एफ
सही? इतना शीघ्र नही! यह भी नहीं हो सका:
48 00 65 00 6 सी 00 6 सी 00 6 एफ 00? ... "
यूनिकोड केवल कोड बिंदु परिभाषित करता है, यानी, एक संख्या जो एक चरित्र का प्रतिनिधित्व करती है। आप इन कोड बिंदुओं को स्मृति में कैसे संग्रहीत करते हैं, आप जिस एन्कोडिंग का उपयोग कर रहे हैं उसके आधार पर निर्भर करता है। यूटीएफ -8 कई अन्य लोगों के बीच यूनिकोड वर्णों को एन्कोड करने का एक तरीका है।
वे एक ही बात नहीं हैं - यूटीएफ -8 यूनिकोड एन्कोडिंग का एक विशेष तरीका है।
आपके आवेदन और आपके द्वारा उपयोग किए जाने वाले डेटा के आधार पर आप कई अलग-अलग एन्कोडिंग चुन सकते हैं। सबसे आम हैं यूटीएफ -8, यूटीएफ -16 और यूटीएफ -32 एस जहां तक मुझे पता है।
Unicode सिर्फ एक मानक है जो इस चरित्र सेट को एन्कोड करने के लिए एक वर्ण सेट ( UCS ) और एन्कोडिंग ( UTF ) को परिभाषित करता है। लेकिन सामान्य रूप से, यूनिकोड को चरित्र सेट में प्रस्तुत किया जाता है, न कि मानक।
निरपेक्ष न्यूनतम सॉफ्टवेयर डेवलपर को पूरी तरह से पढ़ें , सकारात्मक रूप से यूनिकोड और कैरेक्टर सेट्स (कोई बहाना नहीं!) और यूनिकोड के बारे में 5 मिनट में जानना चाहिए ।
यूटीएफ -8 8-बिट अनुक्रमों का उपयोग करके यूनिकोड वर्णों को एन्कोड करने का एक तरीका है।
यूनिकोड कई भाषाओं से वर्णों की एक महान विविधता का प्रतिनिधित्व करने के लिए एक मानक है।
यूनिकोड एक व्यापक-स्कोप्ड मानक है जो 130,000 से अधिक वर्णों को परिभाषित करता है और प्रत्येक संख्यात्मक कोड आवंटित करता है (एक "कोडपॉइंट")। यह इस पाठ को सॉर्ट करने, इसे सामान्य करने, इसके मामले को बदलने, आदि के नियमों को भी परिभाषित करता है। यूनिकोड में एक वर्ण को कोड बिंदु से शून्य से 0x10FFFF समेत समझा जाता है, हालांकि कुछ कोड बिंदु आरक्षित हैं और वर्णों के लिए उपयोग नहीं किए जा सकते हैं।
यूनिकोड में कोड एक से अधिक एन्कोडिंग में प्रदर्शित किए जा सकते हैं। सबसे सरल यूटीएफ -32 है, जो कोड कोड को 32-बिट पूर्णांक के रूप में एन्कोड करता है, प्रत्येक के साथ 4 बाइट चौड़ा होता है।
यूटीएफ -8 एक और एन्कोडिंग है, और तेजी से डी-फैक्टो मानक बन रहा है। यह बाइट मानों के अनुक्रम के रूप में एन्कोड करता है। प्रत्येक कोड बिंदु इन बाइट्स की एक चर संख्या का उपयोग कर सकते हैं। ASCII श्रेणी में संहिता बिंदु ASCII के साथ संगत होने के लिए, एनकोडेड एनकोडेड हैं। इस सीमा के बाहर कोड बिंदु बाइट्स की एक चर संख्या, या तो 2, 3, या 4 का उपयोग करते हैं, इस पर निर्भर करता है कि वे किस सीमा में हैं।
यूटीएफ -8 को इन गुणों के साथ दिमाग में डिजाइन किया गया है:
ASCII वर्ण एएससीआईआई में ठीक उसी तरह एन्कोड किए गए हैं, जैसे कि एएससीआईआईआई स्ट्रिंग यूटीएफ -8 के रूप में भी मान्य है।
बाइनरी सॉर्टिंग: एक निष्क्रिय बाइनरी सॉर्ट का उपयोग करके यूटीएफ -8 तारों को सॉर्ट करना अभी भी सभी कोड बिंदुओं को संख्यात्मक क्रम में क्रमबद्ध किया जाएगा।
ASCII रेंज के बाहर के वर्ण ASCII रेंज में किसी बाइट का उपयोग नहीं करते हैं, यह सुनिश्चित करते हुए कि उन्हें ASCII वर्णों के लिए गलत नहीं किया जा सकता है। यह एक सुरक्षा सुविधा भी है।
यूटीएफ -8 को आसानी से सत्यापित किया जा सकता है, और एक वैधकर्ता द्वारा अन्य चरित्र एन्कोडिंग से अलग किया जा सकता है। अन्य 8-बिट या बहु-बाइट एन्कोडिंग में टेक्स्ट बहुत ही कम ही यूटीएफ -8 के रूप में मान्य होगा।
यादृच्छिक अभिगम: यूटीएफ -8 स्ट्रिंग में किसी भी बिंदु पर यह बताना संभव है कि उस स्थिति में बाइट किसी चरित्र का पहला बाइट है या नहीं, और उस चरित्र की शुरुआत में बैकट्रैक करने के लिए, किसी भी चीज़ को संदर्भित किए बिना स्ट्रिंग की शुरुआत।