वर्ण एन्कोडिंग क्या है
एन्कोडिंग एक समझौता है: «संख्या 65 का मतलब अक्षर A है»। जब आप कोई टेक्स्ट लिखते हैं, तो प्रोग्राम वे संख्याएँ सेव करता है; जब कोई और उसे खोलता है, तो उसका प्रोग्राम उसी समझौते से उन्हें वापस अक्षरों में बदल देता है। अगर दोनों एक ही तालिका इस्तेमाल न करें, तो टेक्स्ट गलत दिखता है।
दो विचार अलग रखने होंगे। एक है वर्ण समुच्चय, यानी यह सूची कि कौन-सी संख्या किस चिह्न की है। दूसरा है कि वे संख्याएँ बाइट में कैसे सेव होती हैं। ASCII में दोनों सीधे-सीधे मिलते हैं; Unicode में नहीं, और वहीं UTF-8 आता है।
ASCII: 7 बिट के 128 वर्ण
ASCII (American Standard Code for Information Interchange का संक्षिप्त रूप) 1960 के दशक में मानक बना। यह 7 बिट इस्तेमाल करता है, यानी 2 की घात 7 = 128 कोड, 0 से 127 तक। इनमें से 33 कंट्रोल वर्ण हैं (0 से 31 और 127) और 95 छपने वाले हैं (32 से 126, स्पेस समेत)।
इसमें मात्रा वाले अक्षर, ñ या यूरो का चिह्न नहीं हैं: इसे अंग्रेज़ी के लिए बनाया गया था। इसी से समझ आता है कि बाद में दूसरी तालिकाओं की ज़रूरत क्यों पड़ी।
| कंट्रोल वर्ण | डेसिमल | हेक्साडेसिमल | बाइनरी (7 बिट) | किसलिए होता है |
|---|---|---|---|---|
| शून्य (NUL) | 0 | 00 | 0000000 | कई भाषाओं में स्ट्रिंग का अंत बताता है |
| क्षैतिज टैब (TAB) | 9 | 09 | 0001001 | अगले टैब स्टॉप पर कूदता है |
| नई पंक्ति (LF) | 10 | 0A | 0001010 | अगली पंक्ति पर जाता है |
| कैरिज रिटर्न (CR) | 13 | 0D | 0001101 | पंक्ति की शुरुआत पर लौटता है |
| एस्केप (ESC) | 27 | 1B | 0011011 | कंट्रोल क्रम शुरू करता है |
| स्पेस | 32 | 20 | 0100000 | छपने वाला पहला वर्ण |
| डिलीट (DEL) | 127 | 7F | 1111111 | वर्ण मिटाता है |
याद रखने लायक रिश्ते
तालिका संयोग से नहीं सजी है। कुछ नियमितताओं के साथ आप कोड याद से पढ़ सकते हैं।
- अंक «0» से «9» 48 से 57 तक हैं (हेक्साडेसिमल में 30 से 39)। किसी अंक का मान उसका कोड घटा 48 है: «7» 55 है, और 55 − 48 = 7।
- बड़े अक्षर 65 («A») से 90 («Z») तक और छोटे अक्षर 97 («a») से 122 («z») तक हैं।
- किसी बड़े अक्षर और उसके छोटे रूप के बीच अंतर हमेशा 32 होता है: «A» = 65 और «a» = 97; «C» = 67 और «c» = 99। बाइनरी में सिर्फ़ एक बिट बदलता है: «A» के लिए 01000001 और «a» के लिए 01100001।
- यह जानने के लिए कि बड़ा अक्षर वर्णमाला में कौन-सी जगह पर है, 64 घटाएँ: «C» 67 है और 67 − 64 = 3, यानी तीसरा अक्षर।
- क्योंकि सारे बड़े अक्षरों (65 से 90) के कोड छोटे अक्षरों (97 से 122) से कम हैं, «कोड के हिसाब» से अक्षरक्रम «Zebra» को «apple» से पहले रख देता है। कई प्रोग्रामों को ठीक से क्रम लगाने के लिए तुलना का अलग विकल्प चाहिए होता है।
पंक्ति का अंत: LF, CR और CRLF
नई पंक्ति सरल-सी चीज़ लगती है, पर सिस्टम के हिसाब से अलग तरह लिखी जाती है। Unix, Linux और macOS एक ही वर्ण LF (10) इस्तेमाल करते हैं। Windows लगातार दो इस्तेमाल करता है, CR और LF (13 और 10), जिन्हें CRLF कहते हैं। पुराने टेलीटाइपों को दो अलग आदेश चाहिए थे: कैरिज को शुरुआत पर लौटाना और कागज़ को एक पंक्ति आगे बढ़ाना।
यही फ़र्क उन फ़ाइलों की वजह है जो साधारण एडिटर में एक ही पंक्ति में दिखती हैं, या हर पंक्ति के अंत में कोई अजीब चिह्न दिखाती हैं। अगर आपको जानना है कि हर एक का कोड क्या है, तो ASCII टेबल की खोज में LF या CR लिखें।
«एक्सटेंडेड ASCII» कोई मानक नहीं है
क्योंकि एक बाइट 8 बिट का होता है और ASCII सिर्फ़ 7 इस्तेमाल करता है, 128 कोड खाली बचते थे (128 से 255 तक) और हर निर्माता और क्षेत्र ने उन्हें अपने ढंग से भरा। इसे «एक्सटेंडेड ASCII» कहा जाता है, लेकिन कोई एक तालिका नहीं है: कई हैं, जिन्हें कोड पेज कहते हैं। दो सबसे जानी-पहचानी हैं Latin-1 (ISO-8859-1), जिसमें é कोड 233 है, और Windows-1252, जो मिलती-जुलती है पर कोड 128 से 159 में अंतर हैं (वहीं, जैसे, यूरो है)।
समस्या यह है कि कोड 233 एक तालिका में «é» का मतलब रखता है और दूसरी में कुछ और। एक तालिका से लिखा और दूसरी से पढ़ा गया टेक्स्ट कचरा दिखाता था। Unicode इसी अव्यवस्था को खत्म करने के लिए बना।
Unicode और UTF-8
Unicode दुनिया की लगभग सभी लेखन प्रणालियों के हर वर्ण को, साथ में चिह्नों और इमोजी को, एक अनूठी संख्या देता है, जिसे कोड पॉइंट कहते हैं। आज इसमें 150,000 से ज़्यादा वर्ण हैं। इसे उपसर्ग U+ और हेक्साडेसिमल के साथ लिखा जाता है: «A» U+0041 है, «ñ» U+00F1 है, यूरो U+20AC है और मुस्कुराते चेहरे वाली इमोजी U+1F600 है। पहले 128 कोड पॉइंट ठीक ASCII वाले ही हैं।
UTF-8 इन संख्याओं को बाइट में सेव करने का सबसे ज़्यादा इस्तेमाल होने वाला तरीका है, और वर्ण के हिसाब से 1 से 4 बाइट लेता है। ASCII के 128 एक ही बाइट लेते हैं, जो हमेशा जैसा ही होता है, इसलिए ASCII टेक्स्ट एक मान्य UTF-8 टेक्स्ट भी है। बाकी ज़्यादा बाइट लेते हैं।
| वर्ण | कोड पॉइंट | UTF-8 में बाइट | बाइट (हेक्साडेसिमल) |
|---|---|---|---|
| A | U+0041 | 1 | 41 |
| é | U+00E9 | 2 | C3 A9 |
| ñ | U+00F1 | 2 | C3 B1 |
| € | U+20AC | 3 | E2 82 AC |
| 😀 | U+1F600 | 4 | F0 9F 98 80 |
«ñ» की जगह «Ã±» क्यों दिखता है
यह सबसे आम गड़बड़ है और इसकी सटीक वजह है। UTF-8 में ñ दो बाइट है: C3 और B1। अगर कोई प्रोग्राम मानता है कि टेक्स्ट Latin-1 में है, तो वह हर बाइट को एक वर्ण की तरह पढ़ता है: C3 «Ã» है और B1 «±»। नतीजा: «Ã±»। यही «é» के साथ होता है, जो «Ã©» दिखता है, और «canción» के साथ, जो «canción» दिखता है।
समाधान लगभग हमेशा प्रोग्राम को बताना होता है कि फ़ाइल को UTF-8 के रूप में खोले (टेक्स्ट एडिटर में या स्प्रेडशीट के इम्पोर्ट सेटिंग में)। जब उलटा होता है, यानी Latin-1 का टेक्स्ट UTF-8 की तरह पढ़ा जाए, तो अक्सर प्रश्नचिह्न वाले हीरे दिखते हैं, क्योंकि वे अकेले बाइट मान्य UTF-8 क्रम नहीं बनाते।
ASCII टेबल और कन्वर्टर कैसे इस्तेमाल करें
«ASCII टेबल» टूल 128 वर्णों को उनके डेसिमल, हेक्साडेसिमल, ऑक्टल और बाइनरी कोड के साथ, और कंट्रोल वाले वर्णों के नाम के साथ दिखाता है।
- खोज में कोई वर्ण, कोड या किसी कंट्रोल वर्ण का नाम लिखें (जैसे A, 65, 41 या LF) ताकि उसकी पंक्ति मिल जाए।
- सिर्फ़ एक समूह देखने के लिए फ़िल्टर बटन (कंट्रोल, अंक, बड़े अक्षर, छोटे अक्षर, चिह्न) इस्तेमाल करें।
- बदलने के लिए «टेक्स्ट» में कोई टेक्स्ट लिखें और प्रारूप चुनें (दशमलव, हेक्साडेसिमल, ऑक्टल या बाइनरी): नीचे कोड दिखते हैं। «Hola» का डेसिमल में 72 111 108 97 और हेक्साडेसिमल में 48 6F 6C 61 बनता है।
- आप उलटा भी कर सकते हैं: «कोड» में स्पेस या कॉमा से अलग किए कोड पेस्ट करें और टेक्स्ट बन जाता है। हेक्साडेसिमल में 0x41 जैसे उपसर्ग स्वीकार होते हैं।
अगर टेक्स्ट में ñ जैसे वर्ण हैं जो ASCII के नहीं हैं, तो टूल बता देता है और उनका Unicode कोड दिखाता है। UTF-8 के असली बाइट देखने के लिए «टेक्स्ट से बाइनरी» इस्तेमाल करें: ñ का 11000011 10110001 आता है, यानी 8-8 बिट के दो बाइट। सीमाएँ: तालिका सिर्फ़ मानक ASCII दिखाती है, एक्सटेंडेड नहीं, और सब कुछ आपके ब्राउज़र में निकाला जाता है, टेक्स्ट किसी सर्वर को नहीं जाता।
अक्सर पूछे जाने वाले सवाल
ASCII में कितने वर्ण होते हैं?
128, कोड 0 से 127 तक, हर एक 7 बिट का। इनमें 33 कंट्रोल के हैं और 95 छपने वाले, स्पेस समेत।
अक्षर A और a का ASCII कोड क्या है?
«A» 65 है (हेक्साडेसिमल में 41, बाइनरी में 01000001) और «a» 97 है (हेक्साडेसिमल में 61, बाइनरी में 01100001)। इनमें हमेशा 32 का अंतर होता है।
ASCII और Unicode में क्या फ़र्क है?
ASCII में अंग्रेज़ी के लिए बने 128 वर्ण हैं। Unicode में 150,000 से ज़्यादा हैं, लगभग सभी भाषाओं और इमोजी के, और इसके पहले 128 वही हैं जो ASCII के हैं।
UTF-8 क्या है?
यह Unicode टेक्स्ट को बाइट में सेव करने का सबसे ज़्यादा इस्तेमाल होने वाला तरीका है। यह हर वर्ण के लिए 1 से 4 बाइट लेता है: ASCII वाले एक लेते हैं, ñ दो और इमोजी चार।
मेरा टेक्स्ट «Ã±» या «Ã©» क्यों दिखा रहा है?
क्योंकि UTF-8 में सेव किया टेक्स्ट Latin-1 की तरह पढ़ा जा रहा है। फ़ाइल को UTF-8 एन्कोडिंग बताकर खोलें और यह ठीक हो जाएगा।