সরাসরি প্রধান সামগ্রীতে চলে যান

Rust-এ Strings এবং UTF-8 এনকোডিং-এর সহজ গাইড

Introduction আজকের এই আলোচনায় আমরা শিখবো Rust প্রোগ্রামিং ল্যাঙ্গুয়েজে Strings কীভাবে কাজ করে। আমরা অনেকেই অন্য প্রোগ্রামিং ল্যাঙ্গুয়েজে স্ট্রিং ব্যবহার করেছি, কিন্তু Rust-এ এটি একটু আলাদা এবং অনেক বেশি শক্তিশালী। বিশেষ করে UTF-8 এনকোডিং ব্যবহার করার কারণে এটি বিশ্বের যেকোনো ভাষা (যেমন- বাংলা, হিন্দি, জাপানিজ) খুব সহজেই বুঝতে পারে। চলুন সহজভাবে এই বিষয়গুলো দেখে নেওয়া যাক।


১. UTF-8 এনকোডিং এবং স্ট্রিং কী?

ভিডিও রেফারেন্স: [00:55]

Rust-এ স্ট্রিংগুলো মূলত UTF-8 encoded। আগেকার সময়ে 'ASCII' এনকোডিং ব্যবহার করা হতো যেখানে একটি অক্ষরের জন্য ১ বাইট জায়গা লাগতো, যার ফলে শুধু ইংরেজি অক্ষর রাখা যেত। কিন্তু UTF-8-এ একটি অক্ষরের জন্য ১ থেকে ৪ বাইট পর্যন্ত জায়গা লাগতে পারে। এর সুবিধা হলো, আমরা শুধু ইংরেজি নয়, বরং বাংলা, ইমোজি বা যেকোনো ভাষা স্ট্রিং হিসেবে সেভ করতে পারি।

  • UTF-8: এটি একটি আন্তর্জাতিক স্ট্যান্ডার্ড যা পৃথিবীর সব বর্ণমালার অক্ষরকে কম্পিউটারের বোঝার উপযোগী করে তোলে।

  • Encoding: সহজ ভাষায়, মানুষের ভাষাকে কম্পিউটারের ভাষায় (বাইনারি/নাম্বার) রূপান্তর করার পদ্ধতি।


২. স্ট্রিং তৈরি এবং পরিবর্তন (Push & Concatenation)

ভিডিও রেফারেন্স: [02:30]

Rust-এ আপনি চাইলে স্ট্রিংয়ের শেষে নতুন লেখা যোগ করতে পারেন। এর জন্য push_str (পুরো বাক্য যোগ করতে) এবং push (একটি মাত্র অক্ষর যোগ করতে) ব্যবহার করা হয়।

কোড উদাহরণ:

Rust

fn main() {
    let mut s = String::from("হ্যালো"); // একটি স্ট্রিং তৈরি করা হলো
    s.push_str(" বন্ধু"); // পুরো একটি শব্দ যোগ করা
    s.push('!'); // একটি মাত্র ক্যারেক্টার যোগ করা
    
    println!("{}", s); // আউটপুট: হ্যালো বন্ধু!
} 

ব্যাখ্যা: এখানে mut ব্যবহার করা হয়েছে কারণ আমরা স্ট্রিংটিকে পরিবর্তন করতে চাই। push_str দিয়ে বড় টেক্সট আর push দিয়ে একটি সিঙ্গেল কোটেশনের মধ্যে থাকা ক্যারেক্টার যোগ করা হয়।


৩. ফরম্যাট ম্যাক্রো (Format Macro) ব্যবহার

ভিডিও রেফারেন্স: [06:40]

যখন অনেকগুলো স্ট্রিং একসাথে জুড়তে হয়, তখন + অপারেটর ব্যবহার করা কিছুটা জটিল হয়ে পড়ে কারণ এটি ওনারশিপ (Ownership) নিয়ে নেয়। এর সহজ সমাধান হলো format! ব্যবহার করা।

কোড উদাহরণ:

Rust

fn main() {
    let s1 = String::from("Rust");
    let s2 = String::from("is");
    let s3 = String::from("awesome");

    // format! ব্যবহার করে সবগুলো জোড়া দেওয়া
    let s = format!("{}-{}-{}", s1, s2, s3);
    
    println!("{}", s); // আউটপুট: Rust-is-awesome
} 

ব্যাখ্যা: format! ফাংশনটি অনেকটা println! এর মতো কাজ করে, কিন্তু এটি স্ক্রিনে প্রিন্ট না করে একটি নতুন স্ট্রিং রিটার্ন করে। এতে মূল স্ট্রিংগুলোর কোনো ক্ষতি হয় না।


৪. স্ট্রিং ইনডেক্সিং কেন কাজ করে না?

ভিডিও রেফারেন্স: [07:13]

অন্যান্য ল্যাঙ্গুয়েজে (যেমন Python বা JavaScript) আপনি s[0] লিখে প্রথম অক্ষর পেতে পারেন, কিন্তু Rust-এ এটি সরাসরি সম্ভব নয়। এর কারণ হলো UTF-8। ধরুন আপনি একটি হিন্দি শব্দ "नमस्ते" (Namaste) লিখলেন। এখানে বাইরে থেকে দেখে মনে হতে পারে ৫-৬টি অক্ষর আছে, কিন্তু মেমোরিতে এটি ১৮ বাইট জায়গা নিতে পারে। যদি আপনি s[0] কল করেন, তবে সেটি একটি পূর্ণাঙ্গ অক্ষর না দিয়ে অর্ধেক ডাটা দিতে পারে যা প্রোগ্রাম ক্র্যাশ করাতে পারে।

  • Indexing: কোনো লিস্ট বা স্ট্রিংয়ের নির্দিষ্ট পজিশন থেকে ডাটা খুঁজে বের করা।

৫. বাইটস, স্কেলার এবং গ্রাফিন ক্লাস্টারস (Bytes, Scalars, Grapheme Clusters)

ভিডিও রেফারেন্স: [10:53]

Rust-এ একটি স্ট্রিংকে তিনভাবে দেখা যায়: ১. Bytes: মেমোরিতে ডাটা যেভাবে জমা থাকে (নাম্বার হিসেবে)। ২. Scalar Values: প্রতিটি ইউনিকোড ক্যারেক্টার আলাদাভাবে। ৩. Grapheme Clusters: আমরা মানুষরা যেভাবে অক্ষরগুলোকে দেখি (যেমন- 'ন' একটি গ্রাফিন)।

কোড উদাহরণ (কিভাবে অক্ষর বা বাইট প্রিন্ট করবেন):

Rust

fn main() {
    let s = "नमस्ते";

    // বাইট প্রিন্ট করা
    for b in s.bytes() {
        print!("{} ", b);
    }

    println!();

    // ক্যারেক্টার প্রিন্ট করা
    for c in s.chars() {
        print!("{} ", c);
    }
} 

ব্যাখ্যা: s.bytes() আপনাকে ওই শব্দের মেমোরি ভ্যালু দেখাবে আর s.chars() আপনাকে প্রতিটি ক্যারেক্টার আলাদা করে দেখাবে।


বিশ্লেষণ ও আমার মতামত

কন্টেন্ট ক্রিয়েটরের উদ্দেশ্য: পিযুষ গর্গ এখানে বোঝাতে চেয়েছেন যে, Rust ল্যাঙ্গুয়েজ স্ট্রিং হ্যান্ডল করার ক্ষেত্রে খুবই সতর্ক। এটি ডেভেলপারকে বাধ্য করে বুঝতে যে ইন্টারনালি ডাটা কীভাবে কাজ করছে। এটি শুরুতে কঠিন মনে হলেও ভবিষ্যতে বড় ধরনের বাগ (Bug) বা এরর থেকে বাঁচায়।

বাস্তব প্রেক্ষাপট ও পরামর্শ: জাভাস্ক্রিপ্টে আমরা স্ট্রিং নিয়ে খুব সহজে কাজ করি কারণ সেখানে পেছনের জটিলতাগুলো লুকানো থাকে। কিন্তু সিস্টেম প্রোগ্রামিং বা হাই-পারফরম্যান্স অ্যাপ বানাতে গেলে Rust-এর এই কঠোর নিয়মগুলো আসলে আশীর্বাদ।

বিকল্প বা সাজেশান: যদি আপনার অনেক জটিল স্ট্রিং বা আন্তর্জাতিক ভাষা নিয়ে কাজ করতে হয়, তবে ভিডিওতে দেখানো unicode-segmentation নামক এক্সটার্নাল লাইব্রেরিটি ব্যবহার করা ভালো। এটি স্ট্রিংকে মানুষের বোঝার মতো (Grapheme) ছোট ছোট ভাগে ভাগ করতে দারুণ সাহায্য করে।

সহজ ভাষায় শেষ কথা: Rust-এ স্ট্রিং মানে শুধু কিছু অক্ষরের সমষ্টি নয়, এটি মেমোরি এবং এনকোডিংয়ের একটি চমৎকার সমন্বয়। শিখতে সময় লাগলেও এটি আপনার কোডিং সেন্স অনেক বাড়িয়ে দেবে।

[

Storing UTF-8 Encoded Text with Strings | Rust Book

Piyush Garg · 1.9K views

](http://www.youtube.com/watch?v=oKGD7JmLOEI)

মন্তব্যসমূহ

এই ব্লগটি থেকে জনপ্রিয় পোস্টগুলি

সিজ্জিন (Sijjin) vs ইল্লিয়িন (Illiyin) পার্থক্য Difference

Sijjin (سِجِّين) এবং Illiyin (عِلِّيِّين) —এ দুটি শব্দ কুরআনে এসেছে এবং দুটোই মানুষের আমলনামা সংরক্ষণ সম্পর্কিত স্থানকে নির্দেশ করে। ১. সিজ্জিন (Sijjin) সিজ্জিন হলো পাপীদের (কাফের, মুনাফিক ও দুরাচারীদের) আমলনামা সংরক্ষণের স্থান। এটি সাত তলদেশের নীচে এক কারাগার বা অন্ধকার জগতে অবস্থিত বলে উল্লেখ রয়েছে। সূরা আল-মুতাফফিফীন (৮৩:৭-৯) তে বলা হয়েছে: "كَلَّا إِنَّ كِتَابَ الْفُجَّارِ لَفِي سِجِّينٍ ۝ وَمَا أَدْرَاكَ مَا سِجِّينٌ ۝ كِتَابٌ مَرْقُومٌ" অর্থ: "না, পাপীদের আমলনামা সিজ্জিনে সংরক্ষিত। তুমি কি জানো, সিজ্জিন কী? এটি এক লিখিত দলিল।" সিজ্জিনকে একটি কারাগার, সংকীর্ণ স্থান, বা নিচের স্তরে অবস্থিত এক অন্ধকার দুনিয়া হিসেবে ব্যাখ্যা করা হয়। ২. ইল্লিয়িন (Illiyin) ইল্লিয়িন হলো সৎকর্মশীলদের (মুমিন ও নেককারদের) আমলনামা সংরক্ষণের স্থান । এটি সপ্তম আসমানের ওপরে সংরক্ষিত এক সম্মানিত স্থান। সূরা আল-মুতাফফিফীন (৮৩:১৮-২১) তে বলা হয়েছে: "كَلَّا إِنَّ كِتَابَ الْأَبْرَارِ لَفِي عِلِّيِّينَ ۝ وَمَا أَدْرَاكَ مَا عِلِّيُّونَ ۝ كِتَابٌ مَرْقُومٌ ۝ يَش...

তারাবিহ সমগ্র - প্রথম আলো

রামাদান ২০২৪ উপলক্ষে প্রথম আলোর নিয়মিত আয়োজন - খতমে তারাবিহ'র সূরা গুলো নিয়ে সংক্ষিপ্ত আলোচনা'র লিংক  নিচে দেওয়া হলো।  লিংকে ক্লিক করলেই আপনাকে আলোচনা তে নিয়ে যাবে। তারাবিহ: ১ | একটি খুন ও গাভি নিয়ে বনি ইসরাইলের বাড়াবাড়ি তারাবিহ: ২ | নারীর মর্যাদা ও অধিকার এবং অলৌকিক তিন ঘটনা তারাবিহ: ৩ | যে ১৪ নারীকে বিয়ে করা হারাম তারাবিতে: ১২ | মহানবী (সা.)–এর আকাশভ্রমণ এবং আসহাবে কাহাফের কাহিনি

রেডমি নোট ৯ এর বিস্তারিত | Redmi Note 9 in Bangla

৩০ এপ্রিল, ২০২০ এ শাওমির ঘোষনা আসে এই ফোনটি নিয়ে। কিন্তু ফোনটি মার্কেটে আসে মে মাসের শেষের দিকে৷ করোনার কারনে ফোনটি বাংলাদেশে আসতে আরো সময় নেয়। বর্তমানে বাংলাদেশে আন অফিশিয়াল ভাবে ফোনটি পাওয়া যাচ্ছে৷ বাংলাদেশে অফিশিয়াল ভাবে এখনো ফোনটি আসার তথ্য নেয়৷ চলুন ফোনটি নিয়ে বিস্তারিত আলোচনা করা যাক। শাওমি নোট সিরিজের ফোন বের করে এদের রেডমি নামে সাব ব্যান্ড৷ এদের কাজ হল এই নোট সিরিজ নিয়ে কাজ করা৷ প্রতিবছর নোট সিরিজের ১/২ টা ফোন বাজারে আসে। সাথে সেই ফোন গুলার বিভিন্ন ভার্সন (যেমন - র‍্যাম ও রমের ভিত্তিতে) বাজারে আসে। এই বছরও তারা রেডমি সিরিজের নোট ৯ বাজারে আনে। এই বছর হয়তো এই সিরিজের আরো ফোন বাজারে আসবে। ডিস্পলেঃ ফোনটির ডিসপ্লে সাইজ ৬.৫৩ ইঞ্চি। এতে আইপিএস এলসিডি ডিসপ্লে ব্যবহার করা হয়েছে। এই ফোনের ডিসপ্লে প্রটেকশন হিসেবে আছে গরিলা গ্লাস ফাইভ। স্ক্রিন আর ফোনের বডির অনুপাত প্রায় ৮৩.৫%। এই ফোনের ডিসপ্লে ফুলএইচডি মানে ১০৮০পি। এই ডিস্পলের দৈর্ঘ্য ১৯.৫ একক এবং প্রস্থ হল ৯ একক। এত বড় ফোনের কারনে এই ফোনের পিপি আই ডেনসিটি ৩৯৫। যা একটু কম। প্লাটফর্মঃ এই ফোনের অপারেটিং সিস্টেম এন্ড্রয়েড ১০ এবং এর...