Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> Ruby

रूबी को समझना:स्ट्रिंग एन्कोडिंग, ASCII और यूनिकोड

ऐसी दुनिया में वर्णों के तार कैसे मौजूद हो सकते हैं जहां कंप्यूटर केवल एक और शून्य को समझते हैं?

खैर…

ठीक वैसे ही जैसे हम किसी डोमेन नाम को आईपी पते पर मैप कर सकते हैं।

या किसी विशिष्ट उत्पाद का बारकोड।

हम कर सकते हैं…

संख्याओं को वर्णों में मैप करें!

जैसे 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 और यूनिकोड के बारे में भी सीखा है।

अब अपना संपादक खोलें और अभ्यास करने में मज़ा लें 😃

पढ़ने के लिए धन्यवाद।


  1. रूबी के साथ चयन क्रम को समझना

    नोट:यह रूबी के साथ अलग-अलग सॉर्टिंग एल्गोरिदम को देखने वाली श्रृंखला का भाग 2 है। भाग 1 ने बबल प्रकार की खोज की। इस पोस्ट में, मैं रूबी के साथ सिलेक्शन सॉर्ट एल्गोरिथम को लागू करने के तरीके के बारे में बताऊंगा। सिलेक्शन सॉर्ट एक इन-प्लेस तुलना सॉर्टिंग एल्गोरिथम है। इसका मतलब यह है कि सॉर्ट किए ग

  1. रूबी में इंसर्शन सॉर्ट को समझना

    नोट:रूबी के साथ विभिन्न सॉर्टिंग एल्गोरिदम को लागू करने पर विचार करने वाली श्रृंखला में यह भाग 4 है। भाग 1 ने बबल सॉर्ट की खोज की, भाग 2 ने चयन प्रकार की खोज की, और भाग 3 ने मर्ज सॉर्ट की खोज की। जैसा कि हम डेटा सॉर्ट करने के लिए विभिन्न तरीकों का पता लगाना जारी रखते हैं, हम इंसर्शन सॉर्ट की ओर रु

  1. रूबी स्ट्रिंग स्वरूपण

    आइए बात करते हैं कि आप रूबी में स्ट्रिंग्स को कैसे प्रारूपित कर सकते हैं। आप एक स्ट्रिंग को प्रारूपित क्यों करना चाहेंगे? ठीक है, हो सकता है कि आप ऐसे काम करना चाहें जैसे संख्या 10 से कम हो (उदाहरण:01, 02, 03…), या कुछ कंसोल आउटपुट कॉलम में अच्छी तरह से स्वरूपित हो। अन्य भाषाओं में आप printf . का