एन्कोडिंग और चारसेट के बीच अंतर क्या है?


151

मैं टेक्स्ट एन्कोडिंग और चारसेट के बारे में उलझन में हूं। कई कारणों से, मुझे अपने आगामी कार्य में गैर-यूनिकोड, गैर-यूटीएफ 8 सामान सीखना होगा।

मुझे "हेडसेट" शब्द ईमेल हेडर में "आईएसओ -2022-जेपी" के रूप में मिलता है, लेकिन टेक्स्ट एडिटर्स में ऐसा कोई एन्कोडिंग नहीं है। (मैंने विभिन्न पाठ संपादकों के आसपास देखा।)

टेक्स्ट एन्कोडिंग और चारसेट के बीच अंतर क्या है? अगर आप मुझे कुछ उपयोग के उदाहरण दिखा सकते हैं तो मैं इसकी सराहना करूँगा।


इस पोस्ट को देखें: stackoverflow.com/questions/13743250/…
rghome

जवाबों:


144

मूल रूप से:

  1. वर्ण आपके द्वारा उपयोग किए जा सकने वाले वर्णों का समूह है
  2. एन्कोडिंग वह तरीका है जो इन वर्णों को मेमोरी में संग्रहीत किया जाता है

42
यह सच है, लेकिन वास्तविक उपयोग में "चारसेट" आमतौर पर चरित्र प्रदर्शन और एन्कोडिंग योजना दोनों को संदर्भित करता है ।
एलन मूर

@AlanMoore वास्तव में, एक ही तरह से "दशमलव विभाजक" के साथ किसी भी संख्या को संदर्भित करने के लिए लोग "दशमलव संख्या" कहते हैं। यह वास्तव में सही नहीं है, लेकिन हां आपको इस बात की जानकारी होनी चाहिए कि कुछ लोग इसका उपयोग करते हैं।
bvdb

2
यह बिल्कुल सही नहीं है। उदाहरण के लिए, यूनिकोड चरित्र सेट को संदर्भित करता है, लेकिन कई संभावित एनकोडिंग (UTF-8, UTF-16, UTF-32) हैं।
रगोम

84

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

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


20
ध्यान दें कि javadoc गलत तरीके से "एन्कोडिंग" के बजाय "charset" का उपयोग करता है, उदाहरण के लिए InputStreamReader में , हम पढ़ते हैं "एक InputStreamReader एक बाइट धाराओं से चरित्र धाराओं तक का एक पुल है: यह बाइट्स पढ़ता है और एक निर्दिष्ट charset का उपयोग करके वर्णों में डिकोड करता है। charset। यह उपयोग नाम द्वारा निर्दिष्ट किया जा सकता है या स्पष्ट रूप से दिया जा सकता है, या प्लेटफ़ॉर्म का डिफ़ॉल्ट चार्ट स्वीकार किया जा सकता है। " । हालांकि, उनका मतलब "एन्कोडिंग" है।
डेविड टोनहोफर

4
आपके समझाने के लिए धन्यवाद। यूनिकोड एक कैरेक्टर सेट है, और UTF-8 यूनिकोड का एक एन्कोडिंग तरीका है , और UTF-16 यूनिकोड का एक और एन्कोडिंग तरीका है ।
होंगचाओहांग

47

अन्य उत्तरों के अलावा मुझे लगता है कि यह लेख एक अच्छा पढ़ा गया http://www.joelonsoftware.com/articles/Unicode.html है

लेख का शीर्षक है " जोएल स्पोलस्की द्वारा लिखित " द एब्सोल्यूट मिनिमम हर सॉफ्टवेयर डेवलपर बिल्कुल, यूनिकोड और कैरेक्टर सेट्स (कोई बहाना नहीं!) के बारे में सकारात्मक रूप से जानना चाहिए । निबंध 10 साल से अधिक पुराना है लेकिन (दुर्भाग्य से) सामग्री अभी भी मान्य है ...


2
लेख शुरू करने के लिए बहुत धन्यवाद। यह है एक अच्छा एक।
टी.के.

9
जोएल के लेख को क्यों पढ़ना चाहिए, इसका संक्षिप्त विवरण देकर इस उत्तर को बेहतर बनाया जा सकता है ।
james.garriss

@mattanja आपके द्वारा प्रदान किया गया लिंक वास्तविक महान है। साझा करने के लिए धन्यवाद। वोट दिया।
22 अक्टूबर को हैगरावल

1
मैं यह महान लेख भी डालना चाहता हूं जो जोएल स्पोल्स्की के लिए थोड़े परिशिष्ट है; Kunststube.net/encoding
mkb

मुझे अपने पहले पढ़ने पर जोएल का लेख समझ में नहीं आया। बल्कि मैंने पाया कि यह
पावरपॉइंट

27

एक वर्ण एन्कोडिंग में निम्न शामिल हैं:

  1. समर्थित पात्रों का समूह
  2. वर्ण और पूर्णांकों के बीच एक मानचित्रण ("कोड अंक")
  3. कोड कोड "कोड इकाइयों" की एक श्रृंखला के रूप में एन्कोडेड हैं (उदाहरण के लिए, यूटीएफ -16 के लिए 16-बिट इकाइयां)
  4. कोड इकाइयों को बाइट्स में कैसे एन्कोड किया जाता है (जैसे, बड़ा-एंडियन या थोड़ा-एंडियन)

चरण # 1 अपने आप में एक "चरित्र प्रदर्शनों की सूची" या सार "चरित्र सेट", और # 1 + # 2 = एक "कोडित वर्ण सेट" है।

लेकिन इससे पहले कि यूनिकोड लोकप्रिय हो गया और सभी (पूर्व एशियाई को छोड़कर) एक-बाइट एन्कोडिंग का उपयोग कर रहा था, चरण # 3 और # 4 तुच्छ थे (कोड बिंदु = कोड इकाई = बाइट)। इस प्रकार, पुराने प्रोटोकॉल स्पष्ट रूप से "वर्ण एन्कोडिंग" और "कोडित वर्ण सेट" के बीच अंतर नहीं करते थे। पुराने प्रोटोकॉल का उपयोग charsetतब होता है जब उनका वास्तव में एन्कोडिंग होता है।


क्या यह होगा कि हम html META टैग में charset = 'utf-8' पढ़ सकते हैं? क्योंकि यह बहुत पहले परिभाषित किया गया था
इलदोसा

26

इसके बाद आने वाले लोगों के लिए अधिक प्रकाश फेंकना, उम्मीद है कि यह मददगार होगा।


अक्षरों का समूह

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

वर्ण सेट के उदाहरण: ASCII (सभी अंग्रेजी वर्ण शामिल हैं), ISO / IEC 646, यूनिकोड (दुनिया की सभी जीवित भाषाओं के वर्ण शामिल हैं)

कोडित वर्ण सेट

एक कोडित वर्ण सेट एक सेट है जिसमें प्रत्येक वर्ण को एक अद्वितीय संख्या दी जाती है। उस विशिष्ट संख्या को "कोड पॉइंट" कहा जाता है।
कोडित वर्ण सेट को कभी-कभी कोड पृष्ठ भी कहा जाता है।

एन्कोडिंग

एन्कोडिंग कुछ बाइट्स के साथ कोड पॉइंट्स को मैप करने की व्यवस्था है, ताकि एक ही एन्कोडिंग स्कीम का उपयोग करके एक सिस्टम को विभिन्न सिस्टम में समान रूप से पढ़ा और लिखा जा सके।

एन्कोडिंग के उदाहरण: ASCII, यूनिकोड एन्कोडिंग योजनाएं जैसे UTF-8, UTF-16, UTF-32।

उपरोक्त 3 अवधारणाओं का विस्तार

  • इस पर विचार करें - देवनागरी वर्ण सेट में वर्ण this क ’का दशमलव कोड बिंदु २३२५ है जिसे यूटीएफ -१६ एन्कोडिंग09 15 का उपयोग करते समय दो बाइट्स ( ) द्वारा दर्शाया जाएगा।
  • "ISO-8859-1" एन्कोडिंग योजना "ü" (यह लैटिन वर्ण सेट में एक चरित्र के अलावा कुछ भी नहीं है) को हेक्सा-दशमलव मान के रूप में दर्शाया गया है FCजबकि "UTF-8" में इसे C3 BCऔर UTF-16 के रूप में दर्शाया गया है FE FF 00 FC
  • विभिन्न एन्कोडिंग योजनाएं विभिन्न वर्णों का प्रतिनिधित्व करने के लिए समान कोड बिंदु का उपयोग कर सकती हैं, उदाहरण के लिए "ISO-8859-1" (जिसे लैटिन 1 भी कहा जाता है) अक्षर 'é' के लिए दशमलव कोड बिंदु मान 233 है। हालांकि, आईएसओ 8859-5 में , समान कोड बिंदु सिरिलिक वर्ण '।' का प्रतिनिधित्व करता है।
  • दूसरी ओर, यूनिकोड वर्ण सेट में एक एकल कोड बिंदु वास्तव में विभिन्न बाइट अनुक्रमों के लिए मैप किया जा सकता है, जिसके आधार पर दस्तावेज़ के लिए एन्कोडिंग का उपयोग किया गया था। कोड बिंदु 2325 (जो हेक्साडेसिमल संकेतन में 915 है) के साथ देवनागरी वर्ण क, यूटीएफ -16 एन्कोडिंग ( 09 15), यूटीएफ -8 के साथ तीन बाइट्स ( E0 A4 95यूटीएफ -32) के साथ चार बाइट्स का उपयोग करते समय दो बाइट्स द्वारा दर्शाया जाएगा। ( 00 00 09 15)

11

एक चरित्र सेट, या चरित्र प्रदर्शनों की सूची, बस पात्रों का एक सेट (एक अनियंत्रित संग्रह) है। एक कोडित वर्ण सेट प्रत्येक वर्ण में प्रत्येक वर्ण को एक पूर्णांक (एक "कोड बिंदु") प्रदान करता है। एन्कोडिंग बाइट्स की एक धारा के रूप में स्पष्ट रूप से कोड बिंदुओं का प्रतिनिधित्व करने का एक तरीका है।


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

6

इसके लिए गुगली की। http://en.wikipedia.org/wiki/Character_encoding

अंतर सूक्ष्म प्रतीत होता है। चारसेट शब्द वास्तव में यूनिकोड पर लागू नहीं होता है। यूनिकोड अमूर्त श्रृंखला के माध्यम से जाता है। अमूर्त वर्ण -> कोड अंक -> कोड बिंदुओं की बाइट्स को एन्कोडिंग।

चारसेट वास्तव में इसे छोड़ देते हैं और सीधे वर्णों से बाइट्स तक कूदते हैं। बाइट्स का क्रम <-> वर्णों का अनुक्रम

संक्षेप में, एन्कोडिंग: कोड पॉइंट -> बाइट्स चारसेट: अक्षर -> बाइट्स


5

एक चारसेट सिर्फ एक सेट है; इसमें या तो यूरो चिह्न है, या फिर यह नहीं है। बस इतना ही।

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


क्या यह विशेषण होना चाहिए?
जोर्ज डब्ल्यू मित्तग

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

1
लिगेसी कैरेक्टर एनकोडिंग अक्सर बायजेक्टिव नहीं होते हैं। उदाहरण के लिए, IBM437 में, ß और 4 दोनों को 0xE1 द्वारा दर्शाया गया है।
dan04

3

मेरी राय में, एक चारसेट एन्कोडिंग (एक घटक) का हिस्सा है, एन्कोडिंग में एक चारसेट विशेषता होती है, इसलिए कई एन्कोडिंग में एक चारसेट का उपयोग किया जा सकता है। उदाहरण के लिए यूनीकोड ​​यूएनएफ -8, यूटीएफ -16 और इसी तरह के एनकोडिंग्स में इस्तेमाल किया जाने वाला चारसेट है। चित्रण यहाँ देखें:चित्रण यहाँ देखें

चारसेट में चार का अर्थ प्रोग्रामिंग दुनिया में चार प्रकार का नहीं है, इसका मतलब है कि वास्तविक दुनिया में एक चार का मतलब है, अंग्रेजी में शायद यह वही है, लेकिन अन्य भाषाओं में नहीं, जैसे कि चीनी, '我' चारसेट में एक अविभाज्य 'चार' है (UNICODE, GB [GBK और GB2312 में उपयोग किया जाता है]), 'a' वर्णमाला (ASCII, ISO-8859 , UNICODE) में भी एक चार है ।


1

मेरे विचार में शब्द "चारसेट" HTTP, MIME और इसी तरह के मानकों को पहचानने के लिए सीमित होना चाहिए, ताकि चरित्र एन्कोडिंग (पाठ वर्णों की एक श्रृंखला से एक मैपिंग बाइट्स के एक अनुक्रम तक) नाम से निर्दिष्ट किया जा सके। उदाहरण के लिए charset=utf-8:।

मुझे पता है, हालांकि, कि MySQL, Java, और अन्य स्थानों पर "एन्सेट" शब्द का उपयोग चरित्र एन्कोडिंग का मतलब हो सकता है।


1

एक एन्कोडिंग चरित्र सेट से बाइट्स और पात्रों के बीच एक मानचित्रण है, इसलिए यह बाइट्स और वर्णों के बीच के अंतर पर चर्चा करने और समझने में मददगार होगा ।

बाइट्स को 0 और 255 के बीच की संख्याओं के रूप में सोचें, जबकि वर्ण "a", "1", "$" और "" "जैसी अमूर्त चीजें हैं। उपलब्ध सभी वर्णों के समुच्चय को एक वर्ण समुच्चय कहा जाता है ।

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

अधिकांश एनकोडिंग एक पुराने वर्ण सेट और एन्कोडिंग पर आधारित होते हैं, जिन्हें ASCII कहा जाता है, जो प्रति चरित्र एक एकल बाइट है (वास्तव में, केवल 7 बिट्स) और इसमें 128 वर्ण होते हैं, जिसमें यूएस अंग्रेजी में उपयोग किए जाने वाले बहुत से सामान्य वर्ण शामिल हैं।

उदाहरण के लिए, यहां ASCII वर्ण सेट में 6 वर्ण हैं जो 60 से 65 के मानों द्वारा दर्शाए गए हैं।

Extract of ASCII Table 60-65
╔══════╦══════════════╗
║ Byte ║  Character   ║
╠══════╬══════════════║
║  60  ║      <       ║
║  61  ║      =       ║
║  62  ║      >       ║
║  63  ║      ?       ║
║  64  ║      @       ║
║  65  ║      A       ║
╚══════╩══════════════╝

पूर्ण ASCII सेट में, सबसे कम मूल्य का उपयोग शून्य है और उच्चतम 127 है (ये दोनों छिपे हुए नियंत्रण वर्ण हैं)।

हालाँकि, एक बार जब आपको बुनियादी ASCII प्रदान करने वाले उदाहरणों (उदाहरण के लिए, लहजे, मुद्रा प्रतीकों, ग्राफिक प्रतीकों आदि के साथ अक्षर) की तुलना में अधिक वर्णों की आवश्यकता शुरू होती है, तो ASCII उपयुक्त नहीं है और आपको कुछ अधिक व्यापक की आवश्यकता है। आपको अधिक वर्ण (एक अलग वर्ण सेट) की आवश्यकता होती है और आपको एक अलग एन्कोडिंग की आवश्यकता होती है क्योंकि सभी वर्णों में फिट होने के लिए 128 वर्ण पर्याप्त नहीं होते हैं। कुछ एनकोडिंग एक बाइट (256 वर्ण) या छह बाइट तक प्रदान करते हैं।

समय के साथ बहुत सारे एनकोडिंग बनाए गए हैं। विंडोज की दुनिया में, CP1252 या ISO-8859-1 है, जबकि लिनक्स उपयोगकर्ता UTF-8 का पक्ष लेते हैं। जावा UTF-16 का उपयोग मूल रूप से करता है।

एक एन्कोडिंग में एक चरित्र के लिए बाइट मानों का एक क्रम एक अन्य एन्कोडिंग में पूरी तरह से अलग चरित्र के लिए खड़ा हो सकता है, या अमान्य भी हो सकता है।

उदाहरण के लिए, में आईएसओ 8859-1 , एक मूल्य की एक बाइट का प्रतिनिधित्व करती है 226, जबकि में UTF-8 यह दो बाइट्स है: 195, 162। हालाँकि, ISO 8859-1 में , 195, 162दो अक्षर होंगे, Ã, 85

जब कंप्यूटर वर्णों के बारे में डेटा को आंतरिक रूप से संग्रहीत करते हैं या इसे किसी अन्य सिस्टम में संचारित करते हैं, तो वे बाइट्स को संग्रहीत या भेजते हैं। एक फ़ाइल खोलने या संदेश प्राप्त करने वाले सिस्टम को बाइट्स देखने की कल्पना करें 195, 162। यह कैसे पता चलता है कि ये कौन से वर्ण हैं?

सिस्टम के लिए उन बाइट्स को वास्तविक पात्रों के रूप में व्याख्या करने के लिए (और इसलिए उन्हें प्रदर्शित करें या उन्हें किसी अन्य एन्कोडिंग में परिवर्तित करें), इसके लिए उपयोग किए गए एन्कोडिंग को जानना आवश्यक है। यही कारण है कि XML हेडर में एन्कोडिंग प्रकट होता है या एक पाठ संपादक में निर्दिष्ट किया जा सकता है। यह सिस्टम को बाइट्स और कैरेक्टर के बीच मैपिंग बताता है।

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