बाइनरी ट्रांसलेटर
टेक्स्ट बाइनरी में इस तरह बदलता है कि हर अक्षर को एक संख्या के रूप में एनकोड किया जाए और वह संख्या आधार दो में लिखी जाए। यह ट्रांसलेटर UTF-8 इस्तेमाल करता है, इसलिए A जैसा सादा अक्षर एक बाइट है — 01000001 — जबकि देवनागरी का हर अक्षर तीन बाइट लेता है और ज़्यादातर इमोजी चार। डिकोड करना उल्टी प्रक्रिया है, जिसमें एक बार में आठ बिट पढ़े जाते हैं।
बाइनरी कैसे बदलें
देवनागरी का एक अक्षर तीन बाइट का होता है
यह इस पेज पर हिंदी पाठक के लिए सबसे काम की बात है। UTF-8 परिवर्तनशील लंबाई वाला है: पहले 128 अक्षर — यानी सादे अंग्रेज़ी अक्षर, अंक और विराम चिह्न — एक-एक बाइट लेते हैं, जबकि देवनागरी का पूरा खंड (U+0900 से U+097F) तीन-तीन बाइट लेता है। इसका सीधा नतीजा यह है कि «नमस्ते» सात नहीं, अठारह बाइट का है — छह ग्राफ़ीम, पर भीतर छह अलग कोड पॉइंट और हर एक तीन बाइट का। यानी हिंदी की एक पंक्ति की बाइनरी अंग्रेज़ी की उतनी ही लंबी पंक्ति से लगभग तीन गुना होती है।
यही बात उन सीमाओं में भी दिखती है जो बाइट में नापी जाती हैं और अक्षरों में नहीं: डेटाबेस कॉलम, पुराने फ़ॉर्म फ़ील्ड और URL की लंबाई। जहाँ 255 बाइट की सीमा अंग्रेज़ी में 255 अक्षर देती है, वहीं हिंदी में वह 85 के आसपास सिमट जाती है।
ASCII के पड़ाव
बड़ा A 65 है और छोटा a 97: ठीक 32 का फ़र्क़, और 32 अपने आप में एक ही बिट है — इसीलिए 01000001 और 01100001 में सिर्फ़ एक जगह फ़र्क़ है, और इसीलिए केस बदलना कभी टेबल में खोजने के बजाय बिट पलटने का काम था। स्पेस 32 है, अंक शून्य 48 है, और छपने लायक़ रेंज 32 से 126 तक चलती है। 32 से नीचे सब कुछ कंट्रोल कोड है, और इसीलिए टेक्स्ट फ़ाइल से चिपकाया Windows का लाइन-एंडिंग दो बाइट — 00001101 00001010 — बनकर आता है, जबकि Unix का एक ही 00001010 होता है।
डिकोड करना ज़्यादा नाज़ुक दिशा है
बिट अपने साथ कोई विराम चिह्न नहीं लाते, इसलिए कटाई मानकर चलनी पड़ती है। यहाँ आठ-आठ बिट पढ़े जाते हैं, और जब कुल संख्या सात से बँटती हो पर आठ से नहीं, तब सात पर लौट आया जाता है — पहेलियों की बहुत-सी बाइनरी बिना पैडिंग वाली सात-बिट ASCII होती है। मिली-जुली चौड़ाई वाले समूह कोई भी डिकोडर वापस नहीं ला सकता, और बाइनरी लिखते समय हर अक्षर को आठ बिट तक भरने का पूरा तर्क यही है।
लोग इसे किस काम में लेते हैं
- किसी पहेली या CTF की बाइनरी स्ट्रिंग पढ़ना
- यह देखना कि किसी ख़ास स्ट्रिंग से कौन-से बिट बनते हैं
- बिट स्तर के कैप्चर को वापस टेक्स्ट की तरह पढ़ना
- हाथ से की गई गणना जाँचना
- कक्षा में अक्षर-एनकोडिंग समझाना
- यह देखना कि देवनागरी का एक अक्षर सचमुच कितने बाइट लेता है
सवाल
01000001, यानी कोड 65 को आठ बिट तक भरा हुआ। छोटा a 01100001 है।
बड़ा H, कोड 72। 01001000 01101001 का मतलब «Hi» है।
UTF-8 में तीन। इसलिए «नमस्ते» अठारह बाइट का है, और बाइट में नापी जाने वाली कोई भी सीमा हिंदी में लगभग एक-तिहाई अक्षर ही समाने देती है।
हाँ। जो 0 या 1 नहीं है वह अनदेखा कर दिया जाता है, इसलिए लाइन ब्रेक, स्पेस और इधर-उधर की कॉमा सब चल जाते हैं।
आठ, या पूरे टेक्स्ट में सात। विभाजक अनदेखे कर दिए जाते हैं और धारा तय चौड़ाई पर काटी जाती है, इसलिए मिली-जुली लंबाई वाले समूह डिकोड नहीं होंगे।
वह संभाल ली जाती है। अगर कुल बिट पूरे बाइट नहीं बनाते पर सात के गुणक हैं, तो उसे सात-बिट ASCII मानकर पढ़ा जाता है।
ताकि डिकोडर धारा को तय अंतराल पर काट सके। बिना पैडिंग के बिट में ऐसा कुछ नहीं होता जो बताए कि एक अक्षर कहाँ ख़त्म हुआ और अगला कहाँ शुरू।
वे 32 की दूरी पर हैं, और 32 अपने आप में एक बिट है: 01000001 बनाम 01100001। उसे पलटने से केस बदल जाता है।
क्योंकि UTF-8 परिवर्तनशील लंबाई वाला है। बुनियादी लैटिन रेंज के बाहर के अक्षर दो, तीन या चार बाइट लेते हैं, और ज़्यादातर इमोजी चार।
MySQL का utf8 कॉलम प्रति अक्षर तीन बाइट रखता है और इमोजी को चार चाहिए। कॉलम का प्रकार utf8mb4 होना चाहिए — देवनागरी तीन बाइट में समा जाती है, इमोजी नहीं।
उन्हें ठुकराने के बजाय अलग-अलग बाइट की तरह पढ़ लिया जाता है, ताकि Latin-1 जैसी धारा भी त्रुटि के बजाय कुछ पहचानने लायक़ बनकर लौटे।
नहीं। बदलाव इसी पेज में होता है, और इसीलिए बहुत बड़े पेस्ट पर भी यह तुरंत काम करता है।