ऐसी दुनिया में वर्णों के तार कैसे मौजूद हो सकते हैं जहां कंप्यूटर केवल एक और शून्य को समझते हैं?
खैर…
ठीक वैसे ही जैसे हम किसी डोमेन नाम को आईपी पते पर मैप कर सकते हैं।
या किसी विशिष्ट उत्पाद का बारकोड।
हम कर सकते हैं…
संख्याओं को वर्णों में मैप करें!
जैसे 97
करने के लिए "a"
।
या 122
करने के लिए "z"
।
ठीक इसी तरह से हम संख्याओं की दुनिया में वर्ण रख सकते हैं।
लेकिन कौन सी संख्याएँ किन वर्णों के साथ जाती हैं?
उस प्रश्न का उत्तर देने के लिए हमने विभिन्न चरित्र मानचित्रण प्रणालियों का आविष्कार किया है।
ASCII से शुरू।
ASCII का अर्थ "सूचना विनिमय के लिए अमेरिकी मानक कोड" है।
आप एक ASCII तालिका पा सकते हैं, या आप रूबी को वर्णों को उनके ASCII मान में बदलने के लिए कह सकते हैं।
इसे पसंद करें :
"a".ord # 97
एकाधिक वर्णों के लिए :
"abc".bytes # [97, 98, 99]
यदि आपके पास एक पूर्णांक है तो आप संबंधित वर्ण प्राप्त कर सकते हैं।
इसे पसंद करें :
97.chr # "a"
ASCII एन्कोडिंग में शामिल हैं :
- कंट्रोल कैरेक्टर (जैसे न्यूलाइन्स, टैब्स, नल)
- प्रतीक (जैसे कोष्ठक, बराबर चिह्न, प्रश्न चिह्न)
- नंबर (0-9)
- अक्षर (ए-जेड, ए-जेड)
जैसा कि हम इस लेख में बाद में देखेंगे, वर्णों की यह सीमा सीमित है।
क्यों?
क्योंकि इसमें चीनी या जापानी जैसी अन्य भाषाओं के वर्ण और प्रतीक शामिल नहीं हैं।
असली दुनिया में ASCII
यह संपूर्ण मैपिंग नंबर टू स्ट्रिंग्स चीज़ आपके लिए परदे के पीछे होती है।
लेकिन कुछ व्यावहारिक उपयोग हैं!
उदाहरण के लिए :
HTTP विनिर्देश URL के अंदर कुछ वर्णों की अनुमति नहीं देता है।
लेकिन आप इन अमान्य वर्णों को ASCII प्रारूप में एन्कोड कर सकते हैं और अधिकांश आधुनिक वेब सर्वर उनकी सही व्याख्या करेंगे।
example.com/a+++ => example.com/a%2B%2B%2B
%2B
क्या है? ?
यह वर्ण है +
, ASCII- एन्कोडेड प्रारूप में।
आप इस ज्ञान का उपयोग पात्रों को बदलने के लिए भी कर सकते हैं।
उदाहरण के लिए :
यदि आप ASCII तालिका को देखते हैं, तो आप देखेंगे कि आप इसमें से 32 घटाकर एक लोअरकेस वर्ण को अपरकेस में बदल सकते हैं।
("a".ord - 32).chr # "A"
यह दूसरे तरीके से भी काम करता है।
("A".ord + 32).chr # "a"
हां।
रूबी में, हमारे पास upcase
है &downcase
तरीके।
लेकिन यह किसी प्रकार के साक्षात्कार प्रश्न, कोडिंग चुनौती, या इसी तरह की स्थिति में आपके लिए सहायक हो सकता है।
यूनिकोड क्या है?
ASCII केवल 127 विभिन्न वर्णों (विस्तारित ASCII के साथ 256) को एन्कोड कर सकता है, यह उन वर्णों को सीमित करता है जिनका हम प्रतिनिधित्व कर सकते हैं।
समाधान?
यूनिकोड।
यूनिकोड एक स्ट्रिंग एन्कोडिंग सिस्टम . है जो एक लाख अलग-अलग वर्णों . तक का प्रतिनिधित्व कर सकता है ।
यह ASCII की तुलना में बहुत अधिक स्थान है!
अब हम सभी प्रकार की भाषाओं के पात्र, नए प्रतीक और यहां तक कि इमोजी भी शामिल कर सकते हैं।
यहां कुछ यूनिकोड है :
ɑΩϕβΣπ
ये ग्रीक वर्णमाला के वर्ण हैं जिन्हें ASCII का उपयोग करके प्रदर्शित नहीं किया जा सकता है।
रूबी में यूनिकोड का उपयोग कैसे करें
रूबी के पास यूनिकोड के लिए समर्थन है, यह रूबी 1.9 के बाद से डिफ़ॉल्ट रूप से सक्षम है।
तो आप यह कर सकते हैं :
π = 3.141592
या यह :
def ★★★ puts "You get 3 stars, great job!" end ★★★ # "You get 3 stars, great job!"
बहुत मजेदार!
लेकिन शायद इन प्रतीकों का उपयोग करके विधियों और चरों को परिभाषित करना व्यावहारिक नहीं है क्योंकि वे हमारे कीबोर्ड में नहीं हैं।
वास्तव में, मान्य, अदृश्य यूनिकोड वर्ण हैं।
उदाहरण :
def puts "Invisible method" end
यह बिना नाम वाली एक विधि की तरह दिखता है, जिसकी सामान्य रूप से अनुमति नहीं है।
लेकिन यह उस अदृश्य यूनिकोड वर्ण के कारण काम करता है!
स्ट्रिंग एन्कोडिंग के तरीके
रूबी के पास विभिन्न एन्कोडिंग सिस्टम के साथ काम करने के तरीके हैं।
उदाहरण के लिए :
"abc".encoding.name # "UTF-8"
कुछ विशेष परिदृश्य हैं जहां वर्तमान एन्कोडिंग (encoding.name
) वास्तविक एन्कोडिंग से मेल नहीं खाता स्ट्रिंग का।
आप इसे किसी वेबसाइट, फ़ाइल, डेटाबेस या किसी अन्य बाहरी स्रोत से डेटा पढ़ते समय पा सकते हैं।
इसके परिणामस्वरूप एक InvalidByteSequenceError
होगा ।
अगर ऐसा होता है आपको एन्कोडिंग बदलनी होगी ।
कैसे?
encode
का उपयोग करना विधि:
"abcΣΣΣ".encode("ASCII", "UTF-8", undef: :replace) # "abc???"
मैं UTF-8 (यूनिकोड) . से कनवर्ट कर रहा/रही हूं करने के लिए ASCII , और क्योंकि Σ
ASCII में वर्ण उपलब्ध नहीं है, हम रूबी को इसे बदलने के लिए कहते हैं।
डिफ़ॉल्ट रूप से, यह अपरिभाषित वर्णों को प्रश्न चिह्नों से बदल देता है।
लेकिन आप इसे बदल सकते हैं।
इसे पसंद करें :
"abcΣΣΣ".encode("ASCII", "UTF-8", invalid: :replace, undef: :replace, replace: "") # "abc"
या "फ़ॉलबैक" विकल्प का उपयोग करके :
"abcΣΣΣ".encode("ASCII", "UTF-8", fallback: {"Σ" => "E"}) # "abcEEE"
यह कह रहा है :
"सभी वर्णों को UTF-8 (यूनिकोड) से ASCII में बदलें, उन वर्णों का अनुवाद करने के लिए फ़ॉलबैक हैश का उपयोग करें जो ASCII में मौजूद नहीं हैं"।
दूसरी विधि, force_encoding
, इस अनुवाद चरण के बिना एन्कोडिंग को बदल देता है।
उदाहरण :
"abc½½½".force_encoding("iso-8859-1")
आप Encoding.aliases
. के साथ उपलब्ध एनकोडिंग की सूची प्राप्त कर सकते हैं विधि।
सारांश
आपने सीखा है कि कैसे कंप्यूटर एन्कोडिंग तालिकाओं का उपयोग करके संख्याओं से वर्ण बनाते हैं! आपने रूबी में ASCII और यूनिकोड के बारे में भी सीखा है।
अब अपना संपादक खोलें और अभ्यास करने में मज़ा लें 😃
पढ़ने के लिए धन्यवाद।