UTF-8 কী? নতুনদের জন্য সহজ ভাষায় ব্যাখ্যা
পৃথিবীর ৯৯% ওয়েবসাইট আজ UTF-8 ব্যবহার করে। আপনি যেই পেজটা এখন পড়ছেন, সেটাও UTF-8 encoded। কিন্তু UTF-8 কীভাবে কাজ করে? কেন এটিকে পৃথিবীর সবচেয়ে সফল text encoding বলা হয়?
এই আর্টিকেলে আমরা একেবারে শুরু থেকে জানব:
- ASCII থেকে Unicode—কেন নতুন encoding দরকার হলো
- UTF-8 আসলে কী
- Byte Pattern কিভাবে কাজ করে
- বাংলা/ইমোজি/চাইনিজ সহ সব ভাষা কেন UTF-8 দিয়ে লেখা যায়
পুরোটা লেখা হয়েছে beginner-friendly করে।
Text মূলত কম্পিউটারের কাছে সংখ্যা
কম্পিউটার শুধুই সংখ্যা বোঝে। তাই “HELLO” লিখতে হলে প্রতিটি অক্ষরকে সংখ্যায় রূপান্তর করতে হয়।
যেমন ASCII অনুযায়ী: H = 72 E = 69 L = 76 O = 79
এভাবে text → number → binary হয়ে কম্পিউটারে জমা থাকে।
ASCII: first সফল টেক্সট এনকোডিং
১৯৬৩ সালে তৈরি হলো ASCII (American Standard Code for Information Interchange)।
এটি ছিল ৭-bit এর একটি fixed-width encoding
- প্রতিটি অক্ষর = ৭ bit
- মোট পসিবল code = 2⁷ = 128
ASCII খুব সুন্দরভাবে ইংরেজি ভাষার ছোট-বড় অক্ষর, সংখ্যা, punctuation এবং control character (newline, tab, Bell ইত্যাদি) গুলোকে ম্যাপ করেছিল।
কিন্তু সমস্যার জায়গা — ASCII কেবল ইংরেজির জন্যই তৈরি। বাংলা, হিন্দি, আরবি তো দূরের কথা—চীনা বা জাপানিজের হাজার হাজার ASCII character তে স্থান পাওয়ার সুযোগই ছিল না।
Unicode: দুনিয়ার সমস্ত অক্ষরের এক মানচিত্র
১৯৮০–এর দিকে যখন বিশ্বজুড়ে কম্পিউটার ছড়িয়ে পড়ছে, তখন প্রয়োজন হল একটি global character system, যেখানে—
সব ভাষার অক্ষর থাকবে
প্রতিটি অক্ষরের জন্য একটি unique number থাকবে
সবাই একই কোড ব্যবহার করবে
এভাবেই জন্ম হলো Unicode Standard।
Unicode হলো এক বিশাল "character map" যেখানে:
- প্রতিটি অক্ষরের জন্য একটি unique code point থাকে
- U+0041 = 'A', U+0985 = 'অ', U+1F600 = 😀
এটি বলে দেয়:
“অমুক অক্ষর = অমুক code point”
কিন্তু একটা কোড থাকলেই হয় না। সেই code point-টি কম্পিউটারের বাইনারিতে কিভাবে সংরক্ষিত হবে—এটাই বড় প্রশ্ন। এখানেই আসে UTF (Unicode Transformation Format)।
সমস্যা শুরু: Unicode বড়, কিন্তু ASCII ছোট
Unicode-এ হাজার হাজার code point আছে। ASCII হয় ৭-bit—অর্থাৎ ১২৮ character। UTF-16 বা UTF-32 ব্যবহার করলে পুরোনো ASCII-ভিত্তিক সফটওয়্যারগুলো সঙ্গে সঙ্গেই নষ্ট হয়ে যেত।
এটিকে বলা হয়:
Backward incompatibility problem
নতুন ফাইল = পুরোনো সফটওয়্যার পড়তে পারবে না
পুরোনো ফাইল = নতুন সফটওয়্যার পড়তে পারবে না
বিশ্বজুড়ে ইমেল সিস্টেম, টার্মিনাল, সার্ভার, পুরোনো অ্যাপ—সবকিছু ASCII-এর উপর নির্ভরশীল ছিল।
সমাধান দরকার ছিল এমন কিছু যা—
ASCII কে ১০০% একই রাখবে
Unicode-এর বিশাল character set-ও encode করতে পারবে
পুরোনো সফটওয়্যার ক্ষতিগ্রস্থ হবেনা
স্টোরেজ কম খাবে
নেটওয়ার্কে দ্রুত ট্রান্সমিট হবে
UTF-8: গেম-চেঞ্জিং সমাধান
UTF-8 তৈরি হলো এক অসাধারণ ভাবনায়:
🎯 ASCII কে একদম আগের মতোই রেখে Unicode-কে encode করা হবে
🎯 variable-width ব্যবহার করা হবে (১–৪ byte)
🎯 তবে ASCII character গুলো শুধু ১ byte-এ থাকবে
🎯 বড় code point হলে byte সংখ্যা বাড়বে
UTF-8 এর স্ট্র্যাটেজি:
| Character Type | Byte Count |
|---|---|
| ASCII (0–127) | ১ byte |
| Accent-যুক্ত Latin Extended character (é, ñ, ç ইত্যাদি) | ২ byte |
| বাংলা / হিন্দি / আরবি / চাইনিজ / জাপানি ইত্যাদি বড় স্ক্রিপ্ট | ৩ byte |
| Emoji এবং বিরল/বিশেষ Unicode character | ৪ byte |
ASCII ফাইল = সরাসরি valid UTF-8
UTF-8 ফাইল = ASCII সফটওয়্যারও বেশিরভাগ ক্ষেত্রে পড়তে পারে
এই backward compatibility-ই UTF-8-এর সাফল্যের কেন্দ্রবিন্দু।
UTF-8 Byte Pattern
UTF-8 চমৎকার একটি rule ব্যবহার করে:
- ASCII byte = শুরুতে 0
- Multi-byte start = 110 / 1110 / 11110
- Continuation byte = সবসময় 10 দিয়ে শুরু
এই design UTF-8–কে self-synchronizing বানিয়েছে।
১) ASCII (১ Byte) Pattern — 0xxxxxxx
ASCII character = একদম আগের মতো → শুধু ১ byte:
0xxxxxxx
উদাহরণ:
A → 01000001
a → 01100001
/ → 00101111
ASCII ফাইল = ১০০% valid UTF-8, এ কারণে পুরোনো সিস্টেম ব্রেক করেনি।
২) 2-Byte UTF-8 Pattern — 110xxxxx 10xxxxxx
Non-ASCII কিন্তু ছোট code point → ২ byte।
110xxxxx 10xxxxxx
প্রথম byte শুরু 110
দ্বিতীয় byte শুরু 10 → continuation
উদাহরণ: é (U+00E9) UTF-8:
11000011 10101001
৩) 3-Byte UTF-8 Pattern — 1110xxxx 10xxxxxx 10xxxxxx
বাংলা, হিন্দি, আরবি, চাইনিজ ইত্যাদির অনেক অক্ষর ৩ byte নেয়।
Pattern:
1110xxxx 10xxxxxx 10xxxxxx
উদাহরণ: “ক” (U+0995) UTF-8:
E0 A6 95
Binary:
11100000 10100110 10010101
৪) 4-Byte UTF-8 Pattern — 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
ইমোজি, বিশেষ script → ৪ byte। উদাহরণ: 😀 (U+1F600) UTF-8:
F0 9F 98 80
Self-Synchronizing: UTF-8 এর অদৃশ্য সুপারপাওয়ার
ধরি byte = 10011010
এটা কখনো character-এর শুরু হতে পারে না, কারণ শুরু হলে 0, 110, 1110, 11110–এর একটি দিয়ে শুরু হতো।
সুতরাং:
UTF-8 স্ক্যান করার সময় তুমি যেকোনো byte থেকে শুরু করলেও text ভাঙবে না।
এই কারণে JSON, log file, HTML parsing—সব UTF-8 এ দ্রুত হয়।
📌 Callout Box: কেন UTF-8 এত সফল?
✔ ASCII safe ✔ Backward compatible ✔ Space-efficient ✔ Binary pattern self-describing ✔ Error detection সহজ ✔ Multilingual support (সব ভাষা) ✔ Internet standard (HTML, JSON, APIs)
UTF-8 গ্লোবালাইজড সফটওয়্যার দুনিয়ার backbone।
UTF-8 vs UTF-16 vs UTF-32
| Encoding | Pros | Cons | ব্যবহার |
|---|---|---|---|
| UTF-8 | ছোট ফাইল, ASCII-friendly, fastest | indexing কঠিন | Web, Linux, JSON |
| UTF-16 | কিছু script efficient | ASCII double space | Windows, Java |
| UTF-32 | fixed-width | ৪ byte সবসময় | internal processing |
উপসংহার
UTF-8 কেবল একটি encoding নয়—
এটি আধুনিক টেক্সট প্রসেসিং-এর সবচেয়ে সুচিন্তিত ইঞ্জিনিয়ারিং ডিজাইনগুলোর একটি।
ASCII কে অক্ষত রেখে Unicode-এর সব ভাষা encode করতে পারা—
এটাই UTF-8-এর সবচেয়ে বড় অর্জন।
আমরা প্রতিদিন ব্যবহার করি—
ওয়েবসাইট, ডাটাবেস, অ্যাপ, মেসেজিং, API
সব জায়গায় UTF-8 চুপচাপ কাজ করে যাচ্ছে।