यूटीएफ -8 और यूनिकोड में क्या अंतर है?


503

मैंने लोगों से परस्पर विरोधी राय सुनी है - विकिपीडिया UTF-8 पृष्ठ के अनुसार।

वे एक ही बात कर रहे हैं, वे नहीं हैं? क्या कोई स्पष्ट कर सकता है?


1
यह WIKI यूनिकोड और UTFs के बारे में क्या लिखता है, मेरी राय में ठीक है। इस पर कुछ टिप्पणियां अजीब हैं: "UTF-8 (या किसी भी अन्य मल्टी-बाइट एन्कोडिंग) में एक चरित्र के बीच में एक स्ट्रिंग को विभाजित या विभाजित करना संभव है, जिसके परिणामस्वरूप एक अमान्य स्ट्रिंग हो सकता है।" तो एक स्ट्रिंग जो UTF-8 एनकोड की जाती है, वह स्ट्रिंग नहीं बल्कि बाइट सरणी या बाइट स्ट्रीम है। स्ट्रिंग बनाने वाले वर्ण एन्कोड हो जाते हैं। बेशक इसे डीकोड भी किया जा सकता है। अब निश्चित रूप से आप स्टार्ट-बाइट के बाद या निम्नलिखित बाइट के बाद utf-8 अनुक्रम में कटौती कर सकते हैं लेकिन किसी को ऐसा क्यों करना चाहिए?
चमकदार जू

स्ट्रिंग डेटा प्रकारों के बारे में यह लेख शैक्षिक है: mortoray.com/2013/11/27/the-string-type-is-broken - कभी-कभी स्ट्रिंग्स और उनके बाइट-स्तरीय घटकों के साथ काम करते समय, आप अनजाने में एक चरित्र को आधा काट सकते हैं ।
एवरेट

जवाबों:


495

दूसरों द्वारा दिए गए उत्तरों पर विस्तार करने के लिए:

हमें बहुत सारी भाषाएं मिली हैं जिनमें बहुत से अक्षर हैं जिन्हें कंप्यूटर को आदर्श रूप में प्रदर्शित करना चाहिए। यूनिकोड प्रत्येक वर्ण को एक अद्वितीय संख्या या कोड बिंदु प्रदान करता है।

कंप्यूटर बाइट के रूप में इस तरह की संख्या से निपटते हैं ... यहां थोड़ा सा इतिहास को छोड़ दें और मेमोरी एड्रेसिंग के मुद्दों को अनदेखा करें, 8-बिट कंप्यूटर एक 8-बिट बाइट का इलाज करेंगे क्योंकि हार्डवेयर पर सबसे बड़ी संख्यात्मक इकाई का आसानी से प्रतिनिधित्व किया जाएगा, 16-बिट कंप्यूटर का विस्तार होगा दो बाइट्स तक, और इसके बाद।

एएससीआईआई जैसे पुराने चरित्र एनकोडिंग (पूर्व-) 8-बिट युग से हैं, और उस समय की कंप्यूटिंग में प्रमुख भाषा को क्रैम करने की कोशिश करते हैं, अर्थात अंग्रेजी में, 0 से 127 तक की संख्या (7 बिट्स) में। वर्णमाला में 26 अक्षरों के साथ, पूंजी और गैर-पूंजी रूप, संख्या और विराम चिह्न दोनों में, जिसने बहुत अच्छा काम किया। ASCII को अन्य, गैर-अंग्रेजी भाषाओं के लिए 8 बिट द्वारा विस्तारित किया गया, लेकिन इस विस्तार द्वारा उपलब्ध कराए गए अतिरिक्त 128 नंबर / कोड पॉइंट को प्रदर्शित की जा रही भाषा के आधार पर विभिन्न वर्णों में मैप किया जाएगा। आईएसओ-8859 मानक इस मानचित्रण के सबसे सामान्य रूप हैं; ISO-8859-1 और ISO-8859-15 (आईएसओ-लैटिन -1, लैटिन 1 के रूप में भी जाना जाता है, और हाँ 8859 आईएसओ मानक के दो अलग-अलग संस्करण भी हैं)।

लेकिन यह पर्याप्त नहीं है जब आप एक से अधिक भाषाओं के चरित्रों का प्रतिनिधित्व करना चाहते हैं, इसलिए सभी उपलब्ध वर्णों को एक ही बाइट में समेटना बस काम नहीं करेगा।

अनिवार्य रूप से दो अलग-अलग प्रकार के एन्कोडिंग हैं: एक अधिक बिट्स जोड़कर मूल्य सीमा का विस्तार करता है। इन एनकोडिंग के उदाहरण यूसीएस 2 (2 बाइट्स = 16 बिट्स) और यूसीएस 4 (4 बाइट्स = 32 बिट्स) होंगे। वे स्वाभाविक रूप से ASCII और ISO-8859 मानकों के समान समस्या से पीड़ित हैं, क्योंकि उनकी मूल्य सीमा अभी भी सीमित है, भले ही यह सीमा बहुत अधिक हो।

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

मल्टी-बाइट एन्कोडिंग (उपरोक्त स्पष्टीकरण के बाद मुझे मल्टी-यूनिट कहना चाहिए) का लाभ यह है कि वे अपेक्षाकृत स्थान-कुशल हैं, लेकिन नकारात्मक पक्ष यह है कि संचालन, तुलना, आदि खोजने जैसे संचालन को सभी पात्रों को यूनिकोड कोड को डिकोड करना होगा। इस तरह के ऑपरेशन किए जाने से पहले अंक (कुछ शॉर्टकट हैं, हालांकि)।

यूसीएस मानकों और यूटीएफ मानकों दोनों यूनिकोड में परिभाषित कोड बिंदुओं को कूटबद्ध करते हैं। सिद्धांत रूप में, उन एन्कोडिंग का उपयोग किसी भी संख्या को एन्कोड करने के लिए किया जा सकता है (एन्कोडिंग का समर्थन करने वाली सीमा के भीतर) - लेकिन निश्चित रूप से इन एन्कोडिंग को यूनिकोड कोड बिंदुओं को एनकोड करने के लिए बनाया गया था। और यही आपके बीच का रिश्ता है।

विंडोज़ तथाकथित "यूनिकोड" तार को UTF-16 स्ट्रिंग्स के रूप में संभालता है, जबकि अधिकांश UNIXes इन दिनों UTF-8 के लिए डिफ़ॉल्ट हैं। HTTP जैसे संचार प्रोटोकॉल UTF-8 के साथ सबसे अच्छा काम करते हैं, क्योंकि UTF-8 में इकाई का आकार ASCII के समान है, और इस तरह के अधिकांश प्रोटोकॉल ASCII युग में डिज़ाइन किए गए थे। दूसरी ओर, UTF-16 सबसे अच्छा औसत देता है सभी जीवित भाषाओं का प्रतिनिधित्व करते समय स्थान / प्रसंस्करण प्रदर्शन ।

यूनिकोड मानक 32 बिट्स में प्रतिनिधित्व किए जाने की तुलना में कम कोड बिंदुओं को परिभाषित करता है। इस प्रकार सभी व्यावहारिक उद्देश्यों के लिए, यूटीएफ -32 और यूसीएस 4 एक ही एन्कोडिंग बन गए, क्योंकि आपको यूटीएफ -32 में मल्टी-यूनिट पात्रों से निपटने की संभावना नहीं है।

आशा है कि कुछ विवरणों में भर जाता है।


9
वैचारिक रूप से, यूसीएस -2 और यूसीएस -4 चरित्र सेट हैं , न कि चरित्र एनकोडिंग (इसलिए नाम)।
मैकेनिकल घोंघा

74
इस पोस्ट में @Tuukka त्रुटियां लीजन हैं। ISO 8859 के सिर्फ 2 से अधिक संस्करण हैं। ASCII ने अंग्रेजी के लिए काम नहीं किया है, घुंघराले उद्धरण, प्रतिशत संकेत, लहजे जैसी चीजें गायब हैं, और पूरी तरह से अधिक - यूनिकोड केवल गैर-अंग्रेजी के बारे में नहीं है ; अंग्रेजी को भी इसकी जरूरत है, !! कोई कोडपॉइंट किसी भी एन्कोडिंग में 4 से अधिक बाइट्स पर कब्जा नहीं करता है ; यह 6-बाइट व्यवसाय फ्लैट-आउट गलत है। आप यूटीएफ को किसी भी यूनिकोड स्केलर मान को एनकोड नहीं कर सकते हैं क्योंकि यह कहता है: सरोगेट और 66 अन्य गैर-शेयरधारक सभी निषिद्ध हैं। UCS-4 और UTF-32 समान नहीं हैं। बहु-इकाई UTF-32 नहीं है। UTF-16 उतने कुशल नहीं हैं जितना कि वे दिखावा करते हैं - & c & c & c!
16

1
ASCII में पाउंड साइन पाउंड शामिल नहीं है, और निश्चित रूप से यूरो साइन € (जो कि ASIIII से काफी कम है) शामिल नहीं है।
TRGG

1
@ टीचर को लगता है कि 6 बाइट्स बिल्कुल असंभव नहीं हैं । इसे देखें: joelonsoftware.com/articles/Unicode.html जो यह दर्शाता है कि वहाँ से चरित्र चरित्र 0x04000000है 0x7FFFFFFF, या बाइनरी में है 1111110v 10vvvvvv 10vvvvvv 10vvvvvv 10vvvvvv 10vvvvvv - और यह वास्तव में 6 बाइट्स है। हालांकि, 6 बाइट्स अधिकतम है , और नहीं के रूप में लेख "छह बाइट्स या अधिक " भ्रामक दावा करता है ।
वाक्यविन्यास

12
@syntaxerror: "केवल कोड अंक 128 और इसके बाद के संस्करण को 2, 3 का उपयोग करके संग्रहीत किया जाता है, वास्तव में, 6 बाइट्स तक।" लिखे जाने पर सटीक था, लेकिन बाद में उसी वर्ष (बारह साल पहले) इसे अमान्य कर दिया गया था। en.wikipedia.org/wiki/UTF-8 का कहना है कि "मूल विनिर्देश 31 बिट (यूनिवर्सल कैरेक्टर सेट की मूल सीमा) तक की संख्या को कवर करता है। नवंबर 2003 में, यूटीएफ -8 को RFC 3629 द्वारा U + पर समाप्त करने के लिए प्रतिबंधित किया गया था। 10FFFF, UTF-16 वर्ण एन्कोडिंग के अवरोधों का मिलान करने के लिए। इसने सभी 5- और 6-बाइट अनुक्रमों को हटा दिया, और 4-बाइट अनुक्रमों में से लगभग आधा। "
मूविंग डक

237

इस विषय को स्पष्ट करने के लिए एक उदाहरण का उपयोग करता हूं:

A chinese character:      汉
it's unicode value:       U+6C49
convert 6C49 to binary:   01101100 01001001

अब तक कुछ भी जादुई नहीं है, यह बहुत सरल है। अब, मान लें कि हम इस चरित्र को हमारी हार्ड ड्राइव पर संग्रहीत करने का निर्णय लेते हैं। ऐसा करने के लिए, हमें चरित्र को द्विआधारी प्रारूप में संग्रहीत करने की आवश्यकता है। हम इसे '01101100 01001001' के रूप में स्टोर कर सकते हैं। किया हुआ!

लेकिन एक मिनट रुकिए, क्या '01101100 01001001' एक पात्र या दो वर्ण हैं? आपको पता था कि यह एक चरित्र है क्योंकि मैंने आपको बताया था, लेकिन जब कोई कंप्यूटर इसे पढ़ता है, तो इसका कोई पता नहीं है। इसलिए हमें कंप्यूटर को यह मानने के लिए किसी प्रकार की "एन्कोडिंग" की आवश्यकता है।

यहीं पर 'UTF-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)

उपरोक्त तालिका के अनुसार, यदि हम 'UTF-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

यह चीनी चरित्र का UTF-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

PS यदि आप इस विषय को अजगर में सीखना चाहते हैं, तो यहां क्लिक करें


6
"लेकिन एक मिनट रुको, '01101100 01001001' एक वर्ण या दो वर्ण हैं? आप जानते थे कि यह एक वर्ण है क्योंकि मैंने आपको बताया था, लेकिन जब कोई कंप्यूटर इसे पढ़ता है, तो इसका कोई पता नहीं होता है। इसलिए हमें किसी प्रकार के" एन्कोडिंग "की आवश्यकता है। कंप्यूटर को इसे एक मानने के लिए कहें। " ठीक है, लेकिन कंप्यूटर अभी भी नहीं जानता कि इसे utf-8 के साथ सांकेतिक शब्दों में बदलना चाहिए?
कोरे तुगे

15
@KorayTugay कंप्यूटर को पता नहीं है कि उसे किस एन्कोडिंग का उपयोग करना चाहिए। आपको यह बताना है कि आप किसी कैरेक्टर को फाइल में सेव करते हैं और फाइल से कैरेक्टर को पढ़ते समय भी।
चेंग

3
@Connor कंप्यूटर को पता नहीं है कि किस प्रारूप का उपयोग करना है। जब आप दस्तावेज़ को सहेजते हैं, तो पाठ संपादक को स्पष्ट रूप से अपने एन्कोडिंग को utf-8 या उपयोगकर्ता द्वारा उपयोग किए जाने वाले किसी भी प्रारूप में सेट करना होगा। इसके अलावा, जब कोई पाठ संपादक प्रोग्राम किसी फाइल को पढ़ता है, तो उसे सही ढंग से डिकोड करने के लिए टेक्स्ट एन्कोडिंग स्कीम का चयन करना होता है। जब आप टाइप कर रहे हों और किसी पत्र में प्रवेश कर रहे हों, तो पाठ संपादक को यह जानना होगा कि आप किस योजना का उपयोग करते हैं ताकि वह इसे सही ढंग से सहेज सके।
चेंग

2
तो उन हेडर की व्याख्या कैसे की जाती है? अगर मैं पहली तालिका को देखता हूं, तो मुझे लगता है: यदि बाइट बिट से शुरू होती है, 0तो चरित्र को 1 बाइट (वर्तमान एक) द्वारा दर्शाया जाता है, यदि बाइट के साथ शुरू होता है, 110तो चरित्र 2 बाइट (वर्तमान और अगले एक) द्वारा दर्शाया जाता है शेष बिट्स के बाद 10)), यदि बाइट के साथ शुरू होता है 1110तो चरित्र को 3 बाइट्स, वर्तमान और अगले 2 बाइट्स (शेष बिट्स के बाद 10) द्वारा दर्शाया जाता है ।
JBoy

2
UTF-8 पर 10 लेख पढ़ें; इसे पढ़ने के बाद मैं 10 सेकंड में समझ गया :)
jrhee17

201

"यूनिकोड" दुर्भाग्य से संदर्भ के आधार पर विभिन्न तरीकों से उपयोग किया जाता है। इसका सबसे सही उपयोग (IMO) एक कोडित वर्ण सेट के रूप में होता है - अर्थात वर्णों का एक समूह और वर्णों के बीच एक मानचित्रण और पूर्णांक कोड बिंदु उनका प्रतिनिधित्व करते हैं।

UTF-8 एक चरित्र एन्कोडिंग है - बाइट्स के अनुक्रमों से पात्रों के अनुक्रमों में परिवर्तित करने और इसके विपरीत। यह पूरे यूनिकोड चरित्र सेट को कवर करता है। ASCII एक बाइट प्रति वर्ण के रूप में एन्कोडेड है, और अन्य वर्ण अपने सटीक कोड बिंदु (वर्तमान में परिभाषित कोड बिंदुओं के लिए 4 बाइट्स, यानी U-0010FFFF तक, और वास्तव में 4 बाइट्स के साथ सामना कर सकते हैं) के आधार पर अधिक बाइट्स लेते हैं। यू-001FFFFF)।

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

यूनिकोड पर कुछ संदर्भ:


16
मुझे लगता है कि यूटीएफ -16 केवल विंडोज प्लेटफॉर्म पर "यूनिकोड" के बराबर है। लोग * nix पर डिफ़ॉल्ट रूप से UTF-8 का उपयोग करते हैं। +1 हालांकि, अच्छा जवाब
जल्फ

10
@Chris: नहीं, ISO-8859-1 है नहीं UTF-8। UTF-8 ने U + 0080 को U + 00FF को दो बाइट्स के रूप में एन्कोड किया, एक को नहीं। विंडोज 1252 और आईएसओ-8859-1 ज्यादातर समान हैं, लेकिन वे मान 0x80 और 0x99 के बीच भिन्न होते हैं यदि मुझे सही याद है, जहां आईएसओ 8859-1 में "छेद" है, लेकिन CP1252 वर्णों को परिभाषित करता है।
जॉन स्कीट

13
UTF-16 को "यूनिकोड" कहने का विचार भ्रम पैदा करने की क्षमता के कारण मेरे साथ बेचैनी से बैठता है - भले ही यह स्पष्ट रूप से केवल .NET सम्मेलन के रूप में इंगित किया गया था। यूटीएफ -16 यूनिकोड का प्रतिनिधित्व करने का एक तरीका है, लेकिन यह "द यूनिकोड एन्कोडिंग" नहीं है।
थोमसट्रेटर

6
@unwesen: UTF-8 को सरोगेट जोड़े की आवश्यकता नहीं है। यह सिर्फ गैर-बीएमपी वर्णों का प्रतिनिधित्व करता है जो उत्तरोत्तर लंबे बाइट अनुक्रमों का उपयोग करता है।
जॉन स्कीट

5
@RoyiNamir: हाँ, "यूनिकोड" दुर्भाग्य से अक्सर "UTF-16" का विशेष रूप से विंडोज में उपयोग करने के लिए उपयोग किया जाता है।
जॉन स्कीट

108

वे एक ही बात नहीं कर रहे हैं - यूटीएफ -8 यूनिकोड एन्कोडिंग का एक विशेष तरीका है।

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


10
हालाँकि, मुद्दा यह है कि कुछ संपादक फ़ाइल को "यूनिकोड" या "यूटीएफ -8" के रूप में सहेजने का प्रस्ताव रखते हैं। तो उस मामले में उस "यूनिकोड" के बारे में उल्लेख यूटीएफ -16 है जो मैं आवश्यक मानता हूं।
सेरियो जूल

71

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


2
हालाँकि, मुद्दा यह है कि कुछ संपादक फ़ाइल को "यूनिकोड" या "यूटीएफ -8" के रूप में सहेजने का प्रस्ताव रखते हैं। तो उस मामले में उस "यूनिकोड" के बारे में उल्लेख यूटीएफ -16 है जो मैं आवश्यक मानता हूं।
सेरियो जूल

एक संख्या, जो एक चरित्र प्रस्तुत करती है वह ASCII भी करती है।
चमकदार

6
इस पृष्ठ के बाकी उत्तरों को देखने से पहले और बाद में इसे पढ़ें
Dodgie

33

यूनिकोड एक ऐसा मानक है जो आईएसओ / आईईसी 10646, यूनिवर्सल कैरेक्टर सेट (यूसीएस) के साथ परिभाषित करता है, जो व्यावहारिक रूप से सभी ज्ञात भाषाओं का प्रतिनिधित्व करने के लिए आवश्यक सभी मौजूदा पात्रों का सुपरसेट है।

यूनिकोड अपने प्रदर्शनों की सूची में प्रत्येक चरित्र को एक नाम और एक संख्या ( चरित्र कोड , या कोड-पॉइंट ) प्रदान करता है।

UTF-8 एन्कोडिंग , कंप्यूटर मेमोरी में इन अक्षरों को डिजिटल रूप से दर्शाने का एक तरीका है। UTF-8 ऑक्टेट के अनुक्रम में प्रत्येक कोड-पॉइंट को मैप करता है (8-बिट बाइट्स)

उदाहरण के लिए,

यूसीएस चरित्र = यूनिकोड हान चरित्र

UCS कोड-पॉइंट = U + 24B62

UTF-8 एन्कोडिंग = F0 A4 AD A2 (हेक्स) = 11110000 10100100 10101101 10100010 (बिन)


नहीं, UTF-8 केवल एक अनुक्रम में कोडपॉइंट करता है जो 127 से अधिक है। 0 से 127 तक सब कुछ एक अनुक्रम नहीं है, बल्कि एक एकल बाइट है। Btw, ASCII एक नंबर के लिए एक चरित्र का नाम भी बताता है, इसलिए यह वही है जो यूनिकोड करता है। लेकिन यूनिकोड कोडपॉइंट 127 पर नहीं रुकता बल्कि 0x10ffff तक चला जाता है।
चमकदार

2
@ पूरी तरह से मैं अलग हूं। Ascii अक्षर वास्तव में एक एकल बाइट अनुक्रम के लिए मैप किए गए हैं। एससीआई वर्णों के लिए कोड के मामले में पहला बिट, जो 0 है, इंगित करता है कि कितने बाइट्स का अनुसरण करते हैं - शून्य। http://www.wikiwand.com/en/UTF-8#/Descriptionपहली पंक्ति पर एक नजर।
नाइटलीट्रल्स

मेरे लिए अच्छी तरह से एक अनुक्रम में एक से अधिक बाइट शामिल हैं। UTF-8 के भीतर एक ASCII चरित्र एकल बाइट है, जो सबसे महत्वपूर्ण बिट के साथ 0. कोडपॉइंट 127 से अधिक है और फिर अनुक्रम की आवश्यकता होती है, जिसमें हमेशा एक शुरुआत होती है और एक, दो या तीन निम्नलिखित बाइट्स होते हैं। तो आप एकल बाइट को "अनुक्रम" क्यों कहेंगे?
चमकीला

ठीक है ... कई बार अंग्रेजी भाषा के वकील सॉफ्टवेयर में जानबूझकर इसके गलत इस्तेमाल से परेशान हो सकते हैं। यहाँ भी ऐसा ही है। आप इस पर बहस कर सकते हैं। लेकिन यह इसे किसी भी स्पष्ट नहीं करेगा।
नाइटलीट्रिल्स

1
@brighty हम्म, गणित में, 0 तत्वों का एक क्रम इसका ठीक है। 1 तत्व का एक क्रम यहाँ भी ठीक है।
चक्स - मोनिका को बहाल करें

24

यूनिकोड केवल एक मानक है जो एक वर्ण सेट ( UCS ) और एनकोडिंग ( UTF ) को परिभाषित करता है ताकि इस वर्ण सेट को एनकोड किया जा सके। लेकिन सामान्य तौर पर, यूनिकोड को वर्ण सेट के लिए संदर्भित किया जाता है न कि मानक को।

पढ़ें 5 मिनट में यूनिकोड और कैरेक्टर सेट (कोई बहाना नहीं!) और यूनिकोड के बारे में पूरी तरह से कम से कम हर सॉफ्टवेयर डेवलपर पूरी तरह से


1
@ सेशियो: मुझे पता है। यद्यपि तीन अलग-अलग UTF-16 एन्कोडिंग हैं: दो स्पष्ट UTF-16LE और UTF-16BE और अंतर्निहित UTF-16 जहां अंतरण BOM के साथ निर्दिष्ट किया गया है।
गुमबो जूल

@ गंबो: बीओएम की कमी का मतलब यह नहीं है कि यह एक अलग एन्कोडिंग है। केवल दो एनकोडिंग हैं।
मूइंग डक

ऊपर दिया गया ब्लॉग Stakcoverflow के CEO द्वारा लिखा गया है।
शैलेश प्रतापवार

23

मौजूदा जवाब पहले से ही बहुत सारे विवरणों की व्याख्या करते हैं, लेकिन यहां सबसे प्रत्यक्ष स्पष्टीकरण और उदाहरण के साथ एक बहुत ही कम जवाब है।

यूनिकोड वह मानक है जो वर्णों को कोडपॉइंट पर मैप करता है।
प्रत्येक वर्ण में एक अद्वितीय कोडपॉइंट (पहचान संख्या) होती है, जो 9731 जैसी संख्या होती है।

UTF-8 एक है एन्कोडिंग कोड पॉइंट्स का।
सभी वर्णों को डिस्क पर (एक फ़ाइल में) संग्रहीत करने के लिए, UTF-8 वर्णों को 4 ऑक्टेट (8-बिट अनुक्रम) - बाइट्स में विभाजित करता है। UTF-8 कई एनकोडिंग (डेटा का प्रतिनिधित्व करने के तरीके) में से एक है। उदाहरण के लिए, यूनिकोड में, (दशमलव) कोड पॉइंट 9731 एक स्नोमैन का प्रतिनिधित्व करता है ( ) का , जिसमें UTF-8 में 3 बाइट्स होते हैं:E2 98 83

यहां कुछ यादृच्छिक उदाहरणों के साथ एक क्रमबद्ध सूची दी गई है


1
नहीं! UTF-8 यूनिकोड वर्णों को एनकोड करने का एक अच्छा तरीका है, लेकिन हम UTF-16 या UTF-32 में भी एन्कोड कर सकते हैं। UTF-32 के साथ हमारे पास DWORD और कोडपॉइंट के बीच 1: 1 संबंध है, UTF-16 के साथ हमारे पास 1: 1 का संबंध है, जो WMP और कोडपॉइंट के बीच केवल BMP के कोडपॉइंट्स के लिए है, सरोगेट्स और BOMs को छोड़कर। UTF-8 में हमारे पास
कोडाइट

5
@brighty: सही है, लेकिन "नहीं!" मैंने लिखा "UTF-8 कई एन्कोडिंग में से एक है" क्योंकि UTF-16 और UTF-32 भी है।
basic6

16

1. यूनिकोड

दुनिया भर में बहुत सारे पात्र हैं, जैसे "$, &, h, a, t;?, 张, 1, =, + ..."।

फिर एक संगठन आता है जो इन पात्रों को समर्पित है,

उन्होंने "यूनिकोड" नामक एक मानक बनाया।

मानक इस प्रकार है:

  • एक ऐसा प्रपत्र बनाएं जिसमें प्रत्येक स्थिति को "कोड बिंदु", या "कोड स्थिति" कहा जाए।
  • पूरे पद U + 0000 से U + 10FFFF के हैं;
  • अब तक, कुछ पदों को पात्रों से भर दिया जाता है, और अन्य पदों को बचाया या खाली किया जाता है।
  • उदाहरण के लिए, स्थिति "U + 0024" चरित्र "$" से भरी हुई है।

पुनश्च: बेशक एक और संगठन है जिसे आईएसओ कहा जाता है जो एक और मानक बनाए रखता है - "आईएसओ 10646" course लगभग समान है।

2. यूटीएफ -8

जैसा कि ऊपर, U + 0024 सिर्फ एक स्थिति है, इसलिए हम "$" अक्षर के लिए कंप्यूटर में "U + 0024" नहीं बचा सकते हैं।

एक एन्कोडिंग विधि होनी चाहिए।

फिर यूटीएफ -8, यूटीएफ -16, यूटीएफ -32, यूसीएस -2 जैसे एन्कोडिंग के तरीके आते हैं।

UTF-8 के तहत, कोड बिंदु "U + 0024" को 00100100 में एन्कोड किया गया है।

00100100 वह मान है जिसे हम "$" के लिए कंप्यूटर में सहेजते हैं।


1
सामान्य तौर पर, यूटीएफ -8 एकमात्र वैरिएंट है जिसका आज कोई भी उपयोग करता है।
रिक जेम्स

2
आईएसओ 10646 यूनिकोड वर्ण सेट का एक समान मानक है। यूनिकोड चरित्र सेट के अलावा बहुत सी चीजों को परिभाषित करता है, जैसे कि छंटाई, मामलों के लिए नियम, आदि। आईएसओ 10646 केवल चरित्र सेट है (जिनमें से वर्तमान में 130,000 से अधिक हैं)। यूनिकोड कंसोर्टियम और आईएसओ संयुक्त रूप से यूनिकोड का विकास करते हैं, जिसका संबंध केवल आईएसओ से होता है जो कि चरित्र सेट और उसके एनकोडिंग के साथ संबंधित है, और यूनिकोड भी पाठ को संसाधित करने के लिए चरित्र गुणों और नियमों को परिभाषित करता है।
थोमसट्रेटर

12

मैंने गम्बो के उत्तर में लिंक की जांच की है, और मैं उन चीजों के कुछ हिस्से को स्टैक ओवरफ्लो पर भी मौजूद करना चाहता था।

"... कुछ लोग गलत धारणा के तहत हैं कि यूनिकोड केवल एक 16-बिट कोड है जहां प्रत्येक वर्ण 16 बिट्स लेता है और इसलिए 65,536 संभव अक्षर हैं। यह वास्तव में सही नहीं है। यह यूनिकोड के बारे में सबसे आम मिथक है। , तो अगर आपको लगता है कि, बुरा मत मानना।

वास्तव में, यूनिकोड का पात्रों के बारे में सोचने का एक अलग तरीका है, और आपको चीजों को सोचने के यूनिकोड के तरीके को समझना होगा या कुछ भी समझ में नहीं आएगा।

अब तक, हमने मान लिया है कि कुछ चिट्ठियों में कुछ बिट्स होते हैं जिन्हें आप डिस्क या मेमोरी में स्टोर कर सकते हैं:

ए -> 0100 0001

यूनिकोड में, किसी अक्षर को एक कोड बिंदु कहा जाता है जो अभी भी एक सैद्धांतिक अवधारणा है। कैसे उस कोड पॉइंट को मेमोरी में दर्शाया जाता है या डिस्क पर एक पूरी कहानी है ... "

"... प्रत्येक वर्णमाला में प्रत्येक प्लेटोनिक पत्र को यूनिकोड संघ द्वारा एक जादुई संख्या दी जाती है जिसे इस तरह लिखा जाता है: U + 0639। इस जादू संख्या को एक कोड बिंदु कहा जाता है। U + का अर्थ है" यूनिकोड "और संख्याएँ हेक्साडेसिमल हैं। U + 0639 अरबी अक्षर ऐन है। अंग्रेजी अक्षर A U + 0041 होगा ...। "

"... ठीक है, तो कहते हैं कि हमारे पास एक स्ट्रिंग है:

हैलो

जो, यूनिकोड में, इन पाँच कोड बिंदुओं से मेल खाता है:

U + 0048 U + 0065 U + 006C U + 006C U + 006F।

कोड बिंदुओं का एक गुच्छा। संख्या, वास्तव में। हमने अभी तक इस बारे में कुछ नहीं कहा है कि इसे मेमोरी में कैसे स्टोर किया जाए या ईमेल संदेश में इसका प्रतिनिधित्व करें ... "

"... यही वह जगह है जहाँ एनकोडिंग आती है।

यूनिकोड एन्कोडिंग के लिए सबसे पहला विचार, जिसके कारण दो बाइट्स के बारे में मिथक था, हे, चलो बस उन संख्याओं को दो बाइट्स में संग्रहीत करें। तो हैलो बन जाता है

00 48 00 65 00 6C 00 6C 00 6F

सही? इतना शीघ्र नही! यह भी नहीं हो सकता है:

48 00 65 00 6C 00 6C 00 6F 00? ... "


ASCII में, एक कोडपॉइंट के लिए एक अक्षर मैप करता है, केवल यूनिकोड में नहीं।
चमकदार

8

यूटीएफ -8 यूनिकोड पाठ के लिए एक संभव एन्कोडिंग योजना है ।

यूनिकोड एक व्यापक-स्कोप्ड मानक है जो 130,000 से अधिक वर्णों को परिभाषित करता है और प्रत्येक संख्यात्मक कोड (एक कोड बिंदु) को आवंटित करता है। यह इस पाठ को कैसे सॉर्ट करता है, इसे सामान्य करता है, इसके मामले को बदलता है, आदि के लिए नियमों को भी परिभाषित करता है। यूनिकोड में एक वर्ण शून्य से 0x10FFFF समावेशी कोड बिंदु द्वारा दर्शाया गया है, हालांकि कुछ कोड बिंदु आरक्षित हैं और वर्णों के लिए उपयोग नहीं किए जा सकते हैं।

एक से अधिक तरीके हैं जो यूनिकोड कोड बिंदुओं की एक स्ट्रिंग को बाइनरी स्ट्रीम में एन्कोड किया जा सकता है। इन्हें "एनकोडिंग" कहा जाता है। सबसे सीधा एन्कोडिंग UTF-32 है , जो प्रत्येक कोड बिंदु को 32-बिट पूर्णांक के रूप में संग्रहीत करता है, जिसमें प्रत्येक 4 फीट चौड़ा होता है।

UTF-8 एक और एन्कोडिंग है, और UTF-32 और अन्य पर कई फायदे के कारण, वास्तविक मानक बन रहा है। यूटीएफ -8 एकल बाइट मूल्यों के अनुक्रम के रूप में एन्कोड करता है। प्रत्येक कोड बिंदु इन बाइट मानों की एक चर संख्या का उपयोग कर सकता है। ASCII रेंज में कोड बिंदु ASCII के साथ संगत होने के लिए, नंगे एन्कोडेड हैं। इस सीमा के बाहर कोड बिंदु बाइट्स की एक चर संख्या का उपयोग करते हैं, या तो 2, 3, या 4, वे किस सीमा में हैं, इस पर निर्भर करता है।

UTF-8 को इन गुणों को ध्यान में रखकर तैयार किया गया है:

  • ASCII वर्ण ठीक वैसे ही एन्कोड किए गए हैं जैसे वे ASCII में हैं, जैसे कि ASCII स्ट्रिंग एक मान्य UTF-8 स्ट्रिंग है।

  • बाइनरी सॉर्टिंग: एक भोले बाइनरी सॉर्ट का उपयोग करके यूटीएफ -8 स्ट्रिंग्स को सॉर्ट करना अभी भी सभी कोड बिंदुओं को संख्यात्मक क्रम में सॉर्ट किया जाएगा।

  • एकाधिक बाइट्स की आवश्यकता वाले वर्णों में ASCII रेंज में कोई बाइट मान नहीं होते हैं, यह सुनिश्चित करना कि उनमें से कुछ भी ASCII वर्णों के लिए गलत नहीं हो सकते। यह भी एक सुरक्षा सुविधा है।

  • UTF-8 को आसानी से मान्य किया जा सकता है, और एक सत्यापनकर्ता द्वारा अन्य वर्ण एन्कोडिंग से अलग किया जा सकता है। अन्य 8-बिट या मल्टी-बाइट एन्कोडिंग में पाठ बहुत कम ही यूटीएफ -8 के रूप में मान्य होगा।

  • रैंडम एक्सेस: UTF-8 स्ट्रिंग के किसी भी बिंदु पर यह बताना संभव है कि उस स्थिति में बाइट किसी वर्ण का पहला बाइट है या नहीं, और अगले या वर्तमान चरित्र की शुरुआत का पता लगाने के लिए, बिना फॉरवर्ड स्कैन करने की आवश्यकता है या कुछ बाइट्स से अधिक पीछे या धारा की शुरुआत में कुछ भी पढ़ें।


नाबालिग अंक की एक जोड़ी: [1] चाहिए नहीं "ASCII वर्ण वास्तव में इनकोड के रूप में वे कर रहे हैं ASCII " के लिए बदला जा "ASCII वर्ण इनकोड बिल्कुल के रूप में वे कर रहे हैं UTF-8 " ? [२] वाक्यांश "यूनिकोड में कोड ..." अस्पष्ट है (मेरे लिए)। क्या आपका मतलब है "यूनिकोड कोड पॉइंट ..." ?
स्कोमिसा

बिंदु 1 के लिए @skomisa, मेरा मतलब था कि ASCII रेंज के भीतर वर्णों की एन्कोडिंग ASCII और UTF-8 के लिए समान है।
थोमसट्रेटर

बिंदु 2 के लिए, यह एक उचित बिंदु है और मैं इसे स्पष्ट करने के लिए संपादित
करूंगा

2

वे एक ही बात कर रहे हैं, वे नहीं हैं?

नहीं, वे नहीं हैं।


मुझे लगता है कि आपके द्वारा संदर्भित विकिपीडिया पृष्ठ का पहला वाक्य एक अच्छा, संक्षिप्त सारांश देता है:

UTF-8 एक चर चौड़ाई वर्ण एन्कोडिंग है जो एक से चार 8-बिट बाइट्स का उपयोग करके यूनिकोड में सभी 1,112,064 वैध कोड बिंदुओं को कूटबद्ध करने में सक्षम है।

समझाने के लिए:

  • यूनिकोड एक मानक है, जो वर्णों से संख्याओं तक, तथाकथित कोड बिंदुओं (जैसे नीचे दिए गए उदाहरण में) को परिभाषित करता है । पूर्ण मानचित्रण के लिए, आप यहाँ देख सकते हैं ।

    ! -> U+0021 (21),  
    " -> U+0022 (22),  
    \# -> U+0023 (23)
    
  • UTF-8 एक कंप्यूटर को समझ सकता है, उर्फ बिट्स में इन कोड बिंदुओं को एनकोड करने के तरीकों में से एक है । दूसरे शब्दों में, यह उन कोड बिंदुओं में से प्रत्येक को बिट्स के अनुक्रम में बदलने या बिट्स के अनुक्रम को समतुल्य कोड बिंदुओं में परिवर्तित करने का एक तरीका है। ध्यान दें कि यूनिकोड के लिए बहुत सारे वैकल्पिक एनकोडिंग हैं।


जोएल एक बहुत अच्छी व्याख्या देता है और यहां के इतिहास का अवलोकन करता है


2

अगर मैं संक्षेप में बताऊं कि मैं इस धागे से क्या इकट्ठा किया था:

यूनिकोड ' वर्णों को क्रमिक संख्याओं (दशमलव रूप में) में अनुवाद करता है

à = 224

UTF-8 एक एन्कोडिंग है जो बाइनरी अभ्यावेदन के लिए इन नंबरों का 'अनुवाद' करता है

224 = 11000011 10100000

ध्यान दें कि हम 224 के बाइनरी प्रतिनिधित्व के बारे में बात कर रहे हैं , न कि इसका बाइनरी फॉर्म, जो 0b11100000 है।


2

यह लेख सभी विवरणों की व्याख्या करता है http://kunststube.net/encoding/

खरीदने वाला

यदि आप 4 बाइट बफर, UTF8 एन्कोडिंग के साथ प्रतीक लिखते हैं , तो आपका बाइनरी इस तरह दिखेगा:

00000000 11100011 10000001 10000010

यदि आप 4 बाइट बफर, UTF16 एन्कोडिंग के साथ प्रतीक लिखते हैं , तो आपका बाइनरी इस तरह दिखेगा:

00000000 00000000 00110000 01000010

जैसा कि आप देख सकते हैं, आप अपनी सामग्री में किस भाषा का उपयोग करेंगे, इस पर निर्भर करता है।

उदा। इस विशेष प्रतीक के लिए: UTF16 एन्कोडिंग अधिक कुशल है क्योंकि हमारे पास अगले प्रतीक के लिए उपयोग करने के लिए 2 अतिरिक्त बाइट्स हैं। लेकिन इसका मतलब यह नहीं है कि आप जापान वर्णमाला के लिए UTF16 का उपयोग करें।

खरीददार से

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

जैसे आप इस डिकोड हैं: 00000000 11100011 10000001 10000010 UTF16 एन्कोडिंग में, आप के साथ खत्म हो जाएगा नहीं

नोट: एनकोडिंग और यूनिकोड दो अलग-अलग चीजें हैं। यूनिकोड एक अद्वितीय कोड बिंदु पर मैप किए गए प्रत्येक प्रतीक के साथ बड़ा (तालिका) है । उदाहरण के प्रतीक (अक्षर) में एक (कोड बिंदु) है : 30 42 (हेक्स)। दूसरी ओर एन्कोडिंग, एक एल्गोरिथ्म है जो प्रतीकों को अधिक उपयुक्त तरीके से परिवर्तित करता है, जब हार्डवेयर को संग्रहीत करता है।

30 42 (hex) - > UTF8 encoding - > E3 81 82 (hex), which is above result in binary.

30 42 (hex) - > UTF16 encoding - > 30 42 (hex), which is above result in binary.

यहाँ छवि विवरण दर्ज करें


बहुत अच्छा जुड़ा हुआ लेख, उम्मीद है कि यह सक्रिय बना रहेगा
योलोब 21

0

UTF-8 यूनिकोड वर्णों को 8-बिट अनुक्रमों का उपयोग करने के लिए कूटबद्ध करने की एक विधि है।

यूनिकोड कई भाषाओं के विभिन्न प्रकार के पात्रों का प्रतिनिधित्व करने के लिए एक मानक है।


4
"8-बिट सीक्वेंस" ...? को सटीकता ... निर्दिष्ट करने के लिए चाहते हो सकता है
deceze
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.