কম্পিউটার টিউটোরিয়াল

রুবি স্ট্রিংস ডিমিস্টিফাইড: ASCII ও Unicode এনকোডিং মাস্টার করুন

কম্পিউটারগুলো শুধু এক ও শূন্য বুঝতে পারলে ক্যারেক্টারসের স্ট্রিংস কীভাবে অস্তিত্বে থাকতে পারে?

ভালো…

যে ভাবে আমরা একটি ডোমেইন নামকে একটি IP অ্যাড্রেসের সাথে ম্যাপ করতে পারি।

অথবা একটি বারকোডকে একটি নির্দিষ্ট প্রোডাক্টের সাথে।

আমরা…

নম্বরকে ক্যারেক্টারসের সাথে ম্যাপ করতে পারি!

97 কে "a" দিয়ে ম্যাপ করা যাবে।

অথবা 122 কে "z" দিয়ে।

এটিই হলো সঠিক পদ্ধতি जिससे আমরা নম্বরের ওয়ার্ল্ডে ক্যারেক্টার পাই।

কিন্তু কোন নম্বর কোন ক্যারেক্টারসের সাথে যাবে?

এই প্রশ্নের উত্তর দিতে আমরা বিভিন্ন ক্যারেক্টার ম্যাপিং সিস্টেম আবিষ্কার করেছি।

ASCII দিয়ে শুরু।

ASCII মানে "American Standard Code for Information Interchange"।

আপনি একটি ASCII টেবিল খুঁজে পেতে পারেন, অথবা রুবিকে ক্যারেক্টারকে তাদের ASCII ভ্যালুতে কনভার্ট করতে বলতে পারেন।

এভাবে:

"a".ord # 97

একাধিক ক্যারেক্টারের জন্য:

"abc".bytes # [97, 98, 99]

আপনার কাছে যদি একটি ইন্টিজার থাকে, তবে আপনি সংশ্লিষ্ট ক্যারেক্টার পেতে পারেন।

এভাবে:

97.chr # "a"

ASCII এনকোডিং شامل করে:

  • কন্ট্রোল ক্যারেক্টারস (যেমন নিউলাইন, ট্যাব, নাল)
  • সিম্বলস (যেমন প্যারেন্থেসিস, ইকুয়ালস সাইন, প্রশ্নচিহ্ন)
  • নম্বর (0-9)
  • ক্যারেক্টারস (a-z, A-Z)

আমরা পরে এই আর্টিকেলে দেখব, এই ক্যারেক্টারসের রেঞ্জ সীমিত।

কেন?

কারণ এতে অন্যান্য ভাষার ক্যারেক্টার ও সিম্বল থাকে না, যেমন চাইনিজ বা জাপানিজ।

রিয়েল ওয়ার্ল্ডে ASCII

এই পুরো নম্বরকে স্ট্রিংসের সাথে ম্যাপ করার জিনিসটি আপনার জন্য পশ്ചাতে চলে।

কিন্তু কিছু প্র্যাক্টিক্যাল ব্যবহার রয়েছে!

উদাহরণ:

HTTP স্পেসিফিকেশন নির্দিষ্ট ক্যারেক্টারসকে URL-এর ভিতরে আ্যালো করবে না।

কিন্তু আপনি এই ইনভ্যালিড ক্যারেক্টারগুলো ASCII ফরম্যাটে এনকোড করতে পারেন এবং অধিকাংশ মডার্ন ওয়েব সার্ভার সেগুলো সঠিকভাবে ইন্টারপ্রেট করবে।

example.com/a+++ => example.com/a%2B%2B%2B

%2B কী?

এটি ক্যারেক্টার +, ASCII-এনকোডেড ফরম্যাটে।

আপনি এই জ্ঞানটি ব্যবহার করে ক্যারেক্টার ট্রান্সফর্মও করতে পারেন।

উদাহরণ:

আপনি যদি ASCII টেবিল দেখেন, আপনি লক্ষ্য করবেন যে আপনি একটি লোয়ারকেস ক্যারেক্টারকে আপারকেসে কনভার্ট করতে পারেন ৩২ বিয়োগ করিয়ে।

("a".ord - 32).chr # "A"

এটি অন্যভাবেও কাজ করে।

("A".ord + 32).chr # "a"

হ্যাঁ।

রুবিতে, আমাদের upcase এবং downcase মেথড রয়েছে।

কিন্তু এটি কোনো ইন্টারভিউ কুয়েশ্চন, কোডিং চ্যালেঞ্জ, বা অনুরূপ পরিস্থিতিতে আপনাকে সাহায্য করতে পারে।

Unicode কী?

ASCII শুধু ১২৭টি আলাদা ক্যারেক্টার এনকোড করতে পারে (extended ASCII-তে ২৫৬), এটি সীমিত করে যে আমরা কী ক্যারেক্টার রিপ্রেজেন্ট করতে পারি।

সমাধান?

Unicode।

Unicode হলো একটি স্ট্রিং এনকোডিং সিস্টেম যা দশ লক্ষ ভিন্ন ক্যারেক্টার রিপ্রেজেন্ট করতে পারে।

এটি ASCII-র চেয়ে অনেক বেশি স্পেস! এখন আমরা সব ধরনের ভাষার ক্যারেক্টার, নতুন সিম্বল এবং এমনকি ইমোজি অন্তর্ভুক্ত করতে পারি।

এখানে কিছু Unicode:

ɑΩϕβΣπ

এগুলো গ্রিক আলফাবেটের ক্যারেক্টার যা ASCII দিয়ে দেখানো যায় না।

রুবিতে Unicode কীভাবে ব্যবহার করবেন

রুবিতে Unicode সাপোর্ট রয়েছে, রুবি ১.৯ থেকে ডিফল্টভাবে এনাবলড।

তাই আপনি এইভাবে করতে পারেন:

π = 3.141592

অথবা এইভাবে:

def ★★★
  puts "You get 3 stars, great job!"
end
★★★ # "You get 3 stars, great job!"

খুব মজার!

কিন্তু মেথড এবং ভেরিয়েবল ডিফাইন করার জন্য এই সিম্বলগুলো ব্যবহার করা সম্ভবত সেটা প্র্যাক্টিক্যাল নয় কারণ এগুলো আমাদের কিবোর্ডে নেই।

বস্তুত, বৈধ, অনদেখা Unicode ক্যারেক্টার রয়েছে।

উদাহরণ:

def ​
  puts "Invisible method"
end
​

এটি একটি নামহীন মেথডের মত দেখে, যা সাধারণত আ্যালোড নয়।

কিন্তু এটি সেই অনদেখা Unicode ক্যারেক্টারের কারণে কাজ করে!

স্ট্রিং এনকোডিং মেথডস

রুবিতে বিভিন্ন এনকোডিং সিস্টেমের সাথে কাজ করার মেথড রয়েছে।

উদাহরণ:

"abc".encoding.name # "UTF-8"

কয়েকটি স্পেশাল সিনেরিও রয়েছে যেখানে কারেন্ট এনকোডিং (encoding.name) আস akibat এনকোডিং-এর সাথে মেলে না।

আপনি এটা পেতে পারেন একটি ওয়েবসাইট, ফাইল, ডেটাবেস বা অন্য এক্সটার্নাল সোর্স থেকে ডেটা পড়ার সময়।

এটি একটি InvalidByteSequenceError ফলাফল দেবে।

যদি এটা হয় আপনাকে এনকোডিং পরিবর্তন করতে হবে।

কীভাবে?

encode মেথড ব্যবহার করে:

"abcΣΣΣ".encode("ASCII", "UTF-8", undef: :replace) # "abc???"

আমি UTF-8 (Unicode) থেকে ASCII-এ কনভার্ট করছি, এবং কারণ Σ ক্যারেক্টার ASCII-তে উপলব্ধ নয়, আমরা রুবিকে সেটি রিপ্লেস করতে বলছি।

ডিফল্টভাবে, এটি অনডিফাইনড ক্যারেক্টারকে প্রশ্নচিহ্ন দিয়ে রিপ্লেস করে।

কিন্তু আপনি সেটি পরিবর্তন করতে পারেন।

এভাবে:

"abcΣΣΣ".encode("ASCII", "UTF-8", invalid: :replace, undef: :replace, replace: "") # "abc"

অথবা "fallback" অপশন ব্যবহার করে:

"abcΣΣΣ".encode("ASCII", "UTF-8", fallback: {"Σ" => "E"}) # "abcEEE"

এটি বলছে:

"UTF-8 (Unicode) থেকে ASCII-এ সকল ক্যারেক্টার রিপ্লেস করো, fallback হ্যাশ ব্যবহার করে যেসব ক্যারেক্টার ASCII-তে নেই সেগুলো ট্রান্সলেট করো"।

আরেক মেথড, force_encoding, এই ট্রান্সলেশন স্টেপ ছাড়া এনকোডিং পরিবর্তন করে।

উদাহরণ:

"abc½½½".force_encoding("iso-8859-1")

আপনি Encoding.aliases মেথড দিয়ে উপলব্ধ এনকোডিংগুলোর একটি লিস্ট পেতে পারেন।

সারসংক্ষেপ

আপনি শিখেছেন কম্পিউটার কীভাবে নম্বর থেকে ক্যারেক্টার তৈরি করে এনকোডিং টেবিল ব্যবহার করে! আপনি রুবিতে ASCII এবং Unicode সম্পর্কেও শিখেছেন।

এখন আপনার এডিটর খুলুন এবং কিছু মজা করার প্র্যাক্টিস করুন 😃

পড়ার জন্য ধন্যবাদ।

  1. রুবিতে সিলেকশন সর্ট মাস্টার করুন: স্টেপ-বাই-স্টেপ ইমপ্লিমেন্টেশন

  2. রুবি দিয়ে ইন্সারশন সর্টিং দক্ষতা অর্জন: ধাপে ধাপে গাইড

  3. রুবি স্ট্রিং ফরম্যাটিং: লিডিং জিরো, কলাম ও printf স্টাইল সহজে

  4. রুবি এনকোডিং সমস্যা ঠিক করার ৩টি প্রামাণিক ধাপ