কম্পিউটার যেভাবে আপনার ভাষা বুঝে


আমরা যখন কম্পিউটারে বা মোবাইলে কিছু লিখি, যেমন “বাংলা”, তখন স্ক্রিনে সুন্দর অক্ষরগুলো দেখতে পাই। কিন্তু কম্পিউটার তো আসলে আমাদের ভাষা বোঝে না; সে শুধু সংখ্যা বোঝে, বিশেষ করে বাইনারি সংখ্যা (0 এবং 1)।  তাহলে কম্পিউটার কীভাবে আমাদের লেখা অক্ষরগুলোকে সংখ্যায় পরিণত করে আবার সংখ্যা থেকে অক্ষরে ফিরিয়ে আনে? এই কাজটি করার প্রক্রিয়াকেই বলা হয় ক্যারেক্টার এনকোডিং (Character Encoding)। আর বর্তমান ইন্টারনেট জগতের সবচেয়ে জনপ্রিয় এবং জাদুকরী এনকোডিং সিস্টেম হলো UTF-8।

অনেক আগে, ১৯৬০-এর দশকে, কম্পিউটারের জগতে ইংরেজি ভাষার দাপট ছিল। তখন

ASCII নামের একটি এনকোডিং সিস্টেম তৈরি করা হয় । এটি ছিল একটি ৭-বিটের সিস্টেম, যার মানে এটি মোট ১২৮টি (

2^7=128) ভিন্ন অক্ষর বা চিহ্নকে সংখ্যায় প্রকাশ করতে পারত । ইংরেজি বর্ণমালা (A-Z, a-z), সংখ্যা (0-9) এবং কিছু জরুরি চিহ্নের (#, $, @) জন্য এই ১২৮টি কোডই যথেষ্ট ছিল। তাই ইংরেজিভাষী দেশগুলোতে এটি আদর্শ হিসেবে প্রতিষ্ঠা পেয়েছিল ।

ASCII শুধু ইংরেজির জন্য ঠিক ছিল, কিন্তু পৃথিবীর বাকি ভাষাগুলোর কী হবে? যেমন— বাংলা, হিন্দি, আরবি, জাপানি বা ফরাসি ভাষার অক্ষর তো ASCII-তে নেই। এর ফলে বিভিন্ন দেশ তাদের নিজেদের ভাষার জন্য আলাদা আলাদা এনকোডিং সিস্টেম তৈরি করতে শুরু করে।

এতে এক বিশাল সমস্যা দেখা দিল। ধরুন, জাপানের একটি কম্পিউটারে জাপানি এনকোডিং ব্যবহার করে একটি ডকুমেন্ট লেখা হলো। সেই ডকুমেন্টটি যদি অন্য দেশের এমন কম্পিউটারে পাঠানো হয় যেখানে ওই নির্দিষ্ট এনকোডিং সিস্টেম নেই, তাহলে লেখাগুলো হিজিবিজি দেখাবে। এই হিজিবিজি বা অর্থহীন অক্ষরকে জাপানি ভাষায় একটি মজার নামও দেওয়া হয়েছে—

মোজিবেকে (Mojibake)

ইন্টারনেটের আবির্ভাবের পর এই সমস্যা আরও প্রকট হয়। কারণ তখন সারা বিশ্ব থেকে মুহূর্তের মধ্যে ডকুমেন্ট আদান-প্রদান শুরু হয় এবং এই এনকোডিং সমস্যার কারণে ওয়েবসাইট বা ইমেইলের লেখা পড়া প্রায় অসম্ভব হয়ে পড়ে ।

এই জগাখিচুড়ি অবস্থা থেকে মুক্তি দিতে জন্ম হয় ইউনিকোড কনসোর্টিয়াম (Unicode Consortium)-এর

তাদের লক্ষ্য ছিল একটাই: পৃথিবীর সব ভাষার সব অক্ষর, চিহ্ন এবং প্রতীককে একটি মাত্র তালিকায় নিয়ে আসা এবং প্রত্যেকটির জন্য একটি করে ইউনিক নম্বর দেওয়া। আজ ইউনিকোডের তালিকায় ১ লাখেরও বেশি অক্ষর রয়েছে—ইংরেজি ‘A’ থেকে শুরু করে বাংলা ‘ক’, এমনকি আপনার প্রিয় ইমোজিটিও (😊) এই তালিকার অংশ । ইউনিকোড শুধু নম্বর বরাদ্দ করেছিল, কিন্তু এই নম্বরগুলোকে বাইনারিতে কীভাবে সাজানো হবে, সেই সমস্যার সমাধান তখনও বাকি ছিল

ইউনিকোডের নম্বরগুলোকে সরাসরি বাইনারিতে রূপান্তর করলে কিছু বড় সমস্যা দেখা দিত। যেমন, ইংরেজি লেখার জন্য ফাইলের আকার প্রায় চারগুণ বড় হয়ে যেত ।

ইউনিকোড ব্যবহারে সমস্যা এবং UTF-8 এর সমাধান

ইউনিকোড সব ভাষার অক্ষরের জন্য একটি করে নম্বর দিয়ে দিলেও, সেই নম্বরগুলোকে সরাসরি বাইনারিতে ব্যবহার করতে গেলে দুটি বড় সমস্যা দেখা দেয়। এই সমস্যাগুলো সমাধানের জন্যই

UTF-8 নামের একটি অসাধারণ কৌশল বা “হ্যাক” তৈরি করা হয়, যার প্রথম খসড়াটি নাকি একটি রেস্তোরাঁর ন্যাপকিনের উপর লেখা হয়েছিল ।

সমস্যা ১: মেমোরির অপচয়

ইউনিকোডের তালিকায় লক্ষাধিক অক্ষর থাকায়, প্রতিটি অক্ষরকে প্রকাশ করার জন্য যদি একটি নির্দিষ্ট আকারের (যেমন, ৩২-বিট) মেমোরি ব্যবহার করা হতো, তবে তা হতো অপচয়।

যেমন, ইংরেজি ‘A’ অক্ষরের ইউনিকোড নম্বর হলো 65, যার বাইনারি 1000001। ৩২-বিটে একে প্রকাশ করলে দাঁড়ায়: 00000000 00000000 00000000 01000001

দেখতেই পাচ্ছেন ২৫টি বাড়তি ‘0’ যোগ করতে হয়েছে। এর ফলে শুধুমাত্র ইংরেজি ভাষায় লেখা একটি ফাইলের আকার প্রয়োজনের তুলনায় প্রায় চারগুণ বড় হয়ে যেত ।

সমস্যা ২: Null Character বা খালি বাইট

অনেক পুরোনো কম্পিউটার সিস্টেম পরপর আটটি শূন্য 00000000) পেলে, সেটিকে “নাল ক্যারেক্টার” (null character) হিসেবে ধরে নেয় এবং মনে করে লেখাটি সেখানেই শেষ হয়ে গেছে ।

উপরের ৩২-বিটের উদাহরণে দেখুন, ‘A’ অক্ষরটি প্রকাশ করতে গিয়েই তিনটি 00000000 বাইট তৈরি হয়েছে। ফলে, কোনো পুরোনো সিস্টেম এই লেখাটি পড়ার সময় প্রথম আটটি শূন্য দেখেই থেমে যেত এবং বাকি লেখাটা আর পড়ত না ।

UTF-8 এই দুটি সমস্যারই খুব সুন্দরভাবে সমাধান করে।

মেমোরি অপচয় রোধ: UTF-8 পরিবর্তনশীল দৈর্ঘ্যের এনকোডিং ব্যবহার করে। এটি ইংরেজি ‘A’ (ইউনিকোড ৬৫) এর জন্য মাত্র

১ বাইট (01000001) ব্যবহার করে । এতে কোনো বাড়তি শূন্য থাকে না, তাই ফাইলের আকারও বড় হয় না। এটি ASCII-এর সাথেও শতভাগ সামঞ্জস্যপূর্ণ ।

Null Character সমস্যার সমাধান: UTF-8 এমনভাবে ডিজাইন করা হয়েছে যে এটি সাধারণ লেখার ক্ষেত্রে কখনোই 00000000 বাইট তৈরি করে না । এমনকি বাংলা ‘ক’ (ইউনিকোড ২৪৫৩) এর মতো জটিল অক্ষর এনকোড করার সময়ও নয়।

‘ক’ অক্ষরটিকে UTF-8 তিনটি বাইটে প্রকাশ করে:

11101001

10100101

10010101

এখানে লক্ষ্য করুন, কোনো বাইটই 00000000 নয়। প্রথম বাইটের

1110 প্যাটার্ন কম্পিউটারকে জানিয়ে দেয় যে এটি একটি ৩-বাইটের অক্ষর এবং পরের দুটি বাইট 10 দিয়ে শুরু হবে ।


Leave a Reply

Your email address will not be published. Required fields are marked *

Thank's for visiting me!

X