सामान्य उपयोग में "charset" का वास्तव में "एन्कोडिंग" क्यों है?


10

कुछ ऐसा जो लंबे समय से मुझे भ्रमित करता है, वह यह है कि बहुत सारे सॉफ्टवेयर शब्द "चारसेट" और "एन्कोडिंग" को समानार्थक शब्द के रूप में उपयोग करते हैं।

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

चूँकि वे नियम कभी-कभी केवल सभी यूनिकोड वर्णों के कुछ सबसेट को "एनकोड" करने की क्षमता प्रदान करते हैं, आप सोच सकते हैं कि "वर्ण" - 'वर्णों के समूह' के लिए संक्षिप्त है - बस यूनिकोड वर्णों का एक सेट होगा - बिना किसी संबंध के वे पात्र एन्कोडेड हैं। एक एन्कोडिंग इस प्रकार एक charset (ASCII की तरह एक एन्कोडिंग, जो केवल 128 वर्ण एन्कोडिंग के लिए नियम है, उन 128 वर्णों के charset के साथ जुड़ा होगा) लेकिन एक charset इंकोडिंग नहीं की जरूरत है (उदाहरण के लिए, UTF-8, UTF -16 और यूटीएफ -32 सभी अलग-अलग एन्कोडिंग हैं लेकिन वर्णों के एक ही सेट को एन्कोड कर सकते हैं)।

फिर भी - और यहाँ मेरे सवाल का क्रूस है - "चारसेट" शब्द का वास्तविक-विश्व उपयोग इस बात से मेल नहीं खाता कि शब्द का निर्माण क्या होगा। यह लगभग हमेशा "एन्कोडिंग" का मतलब होता है।

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

  • charsetHTML में विशेषता एनकोडिंग निर्दिष्ट करने के लिए प्रयोग किया जाता है
  • Charsetजावा में एनकोडिंग हैं
  • charsets और character setsMySQL में एक बार फिर से एनकोडिंग हैं

भाषा का यह जिज्ञासु (ab) उपयोग कितना पुराना है और this charset ’की यह प्रति-सहज परिभाषा कैसे अस्तित्व में आई? क्या यह संभवत: ऐसे समय से उत्पन्न हुआ है जब वास्तव में , व्यवहार में, उपयोग में आने वाले एन्कोडिंग और उनके द्वारा समर्थित पात्रों के सेट के बीच एक-से-एक मानचित्रण था? या क्या कुछ विशेष रूप से प्रभावशाली मानक या विनिर्देश थे जिन्होंने शब्द की इस परिभाषा को निर्धारित किया?


5
charsetयूनिकोड मानक का उपयोग करता है, इसलिए हो सकता है कि यह "वन-वन-वन मैपिंग" न हो, किसी दस्तावेज़ के लिए आवश्यक वर्ण जो एन्कोडिंग की पसंद को लागू करने के लिए प्रवृत्त होते हैं। लेकिन मेरे पास शब्द के वास्तविक इतिहास पर शोध करने का समय नहीं है ...
अमीलियाबीआर

2
आप चरित्र सेट के बारे में "यूनिकोड वर्णों का एक सेट" के रूप में बात करते हैं, जैसे कि किसी ने यूनिकोड के साथ शुरुआत की और फिर उपसमुच्चय को चुना। यूनिकोड के आविष्कार (या यूनिकोड के सर्वव्यापी बनने से कम से कम पहले) से कई वर्ण सेट मौजूद हैं, यह कहना अधिक सटीक है, और यूनिकोड का निर्माण जानबूझकर किया गया है।
जॉन बार्थोलोम्यू

जवाबों:


3

चरित्र सेट की अवधारणा यूनिकोड से पुरानी है।

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

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

HTML में चारसेट विशेषता (जो HTTP कंटेंट-टाइप हेडर में charset पैरामीटर को प्रदर्शित करता है) उदाहरण के लिए, यूनिकोड से पहले व्यापक रूप से अपनाया गया था, लेकिन जब यूनिकोड को इंटरनेट के सार्वभौमिक वर्ण सेट के रूप में स्वीकार करने का निर्णय लिया गया, तो charset विशेषता उपयोग में एन्कोडिंग को निर्दिष्ट करने के लिए बस फिर से परिभाषित किया गया था , लेकिन नाम को पीछे की संगतता की अनुमति देने के लिए नहीं बदला गया था।


9

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

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

तब जो सबसे ज्यादा मायने रखता था वह यह था कि पहचानकर्ता charsetको MIME और HTTP में उपयोग में लिया गया था। HTTP 1.0 उर्फ RFC 1945 ने MIME परिभाषा को उद्धृत किया, "ऑक्टेट्स के अनुक्रम को वर्णों के अनुक्रम में बदलने के लिए एक या अधिक तालिकाओं के साथ उपयोग की जाने वाली विधि" और फिर भ्रम पर टिप्पणी: "वर्ण सेट 'शब्द का यह उपयोग अधिक है आमतौर पर 'वर्ण एन्कोडिंग' के रूप में जाना जाता है। हालांकि, चूंकि HTTP और MIME एक ही रजिस्ट्री साझा करते हैं, इसलिए यह महत्वपूर्ण है कि शब्दावली भी साझा की जाए। ”


1

RFC2045 ने MIME में "कैरेक्टर सेट" पेश किया और उस समय तक यह पहले से ही स्पष्ट था कि सभी एनकोडिंग ने एक ऑक्टेट पर एक चार्ट मैप नहीं किया था। RFC2130 इस इतिहास की थोड़ी और चर्चा करता है।

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


यह मुझे ऐसा लगता है जैसे RFC 1341 (जून 1992) में 'charset' पैरामीटर पहले से मौजूद था ।
जॉन बार्थोलोम्यू

1

पाठ के हस्तांतरण के लिए कम से कम 2 एन्कोडिंग लागू हैं। वर्ण एन्कोडिंग वर्णन करता है कि वर्ण (ग्लिफ़) कैसे एन्कोड किए गए हैं। सभी भाषाएँ UCS वर्ण सेट के सबसेट का उपयोग करती हैं, जिन्हें अक्सर 8 बिट मान में एन्कोड किया जाता है। मानकीकृत वर्ण सेट में मानक वर्ण एन्कोडिंग होते हैं, और शब्द आमतौर पर परस्पर विनिमय के लिए उपयोग किए जाते हैं।

ट्रांसफर एन्कोडिंग बताता है कि टेक्स्ट कैसे ट्रांसफर किया जाता है और आमतौर पर कैरेक्टर एन्कोडिंग से स्वतंत्र होता है। अधिकांश स्थानांतरण एन्कोडिंग पारदर्शी नहीं हैं और बाइट्स अनुक्रम को स्थानांतरित किया जा रहा है। 8-बिट ट्रांसफर एन्कोडिंग 8-बिट एन्कोडिंग के लिए पारदर्शी है। 7-बिट ट्रांसफर एन्कोडिंग केवल ASCII जैसे 7-बिट वर्ण सेट को स्थानांतरित कर सकता है

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

आईबीएम मेनफ्रेम ईबीसीडीआईडी ​​का उपयोग करते हैं जो एक अलग 8-बिट एन्कोडिंग का उपयोग करता है। अनुवाद तालिकाएँ हैं जो ASCII और ECBDIC वर्ण एन्कोडिंग के बीच मुद्रण योग्य वर्णों को मैप करती हैं। ECBDIC में ASCII की तुलना में बड़ा वर्ण सेट है क्योंकि इसमें ASCII में विराम चिह्न उपलब्ध नहीं हैं। यदि प्रारंभिक एन्कोडिंग ECBDIC है, तो यह इन दो एन्कोडिंगों के बीच पूर्ण दौर यात्रा परिवर्तन को रोकता है।

ये एन्कोडिंग उन भाषाओं के लिए पर्याप्त नहीं थे, जिन पर ASCII के प्रिंट करने योग्य अक्षर नहीं हैं। Microsoft और अन्य ने ASCII वर्ण सेट में 8-बिट एक्सटेंशन का उपयोग किया और 127 से ऊपर के मूल्यों के साथ अतिरिक्त वर्णों को एन्कोड किया। सभी भाषाओं के लिए एक एकल एक्सटेंशन पर्याप्त नहीं था क्योंकि ये एक्सटेंशन केवल वर्ण सेट में 96 वर्णों तक जोड़े गए थे। इसके परिणामस्वरूप अलग-अलग भाषाओं के लिए अलग-अलग 8 बिट चरित्र एन्कोडिंग के साथ कई चरित्र सेट (वर्ण) का उपयोग किया गया। इन चरित्र सेटों में उस भाषा या भाषा परिवार के लिए आवश्यक वर्ण शामिल हैं। अतिरिक्त वर्ण विभिन्न वर्णों में अलग-अलग मानों में एन्कोड किए जा सकते हैं। अंग्रेजी उपयोगकर्ताओं को यह विस्तारित विराम चिह्न (बाएं और दाएं उद्धरण चिह्न, और डैश) के साथ नोटिस करने की संभावना है जो गलत चरित्र सेट का उपयोग किए जाने पर गलत तरीके से दिखाते हैं।

एकल बाइट एन्कोडिंग के लिए केवल वर्ण सेट में वर्ण एन्कोड किए जा सकते हैं। कुछ भाषाओं को अपने चरित्र सेट को कवर करने के लिए मल्टी-बाइट एन्कोडिंग की आवश्यकता होती है। यूनिकोड (UCS) वर्ण सेट के लिए ASCII वर्ण सेट के बाहर वर्णों के लिए मल्टी-बाइट एन्कोडिंग की आवश्यकता होती है। यह चरित्र सेट सभी भाषा विशिष्ट एन्कोडिंग का सुपरसेट है। यूटीएफ -8 यूसीएस चरित्र सेट की एक कॉम्पैक्ट एन्कोडिंग है। ASCII को अतिरिक्त बाइट्स की आवश्यकता नहीं है, और अधिकांश (सभी?) यूरोपीय भाषा वर्णों को एक या दो बाइट्स के रूप में एन्कोड किया जा सकता है। पूर्ण UCS-2 वर्ण सेट को एक से तीन बाइट्स में एन्कोड किया जा सकता है। वर्तमान UCS वर्ण सेट के सभी वर्ण एक से चार बाइट्स में एन्कोड किए जा सकते हैं।


0

FWIW, IIRC, वापस कमोडोर 64 दिनों में, एक वर्ण सेट {0, ... 255} से एक फ़ंक्शन था जो सभी uxv काले और सफेद चित्रों के सेट पर था जहां u और v शायद 8 और 12 थे। इसलिए "अपने को बदलना" वर्ण सेट "का अर्थ उन छवियों को धारण करने के लिए निर्दिष्ट मेमोरी स्थानों को संशोधित करने के लिए BASIC भाषा में POKE कमांड का उपयोग करना है। उदाहरण के लिए ASCII कोड 65 का अर्थ था A और A की छवि को मेमोरी एड्रेस पर शुरू करके कुछ b के लिए * 65 + b में स्टोर किया जाएगा और मुझे a = u * v लगता है।

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