অক্ষর এনকোডিং কী
এনকোডিং হলো একটি চুক্তি: «65 সংখ্যাটির অর্থ অক্ষর A»। আপনি যখন কোনো টেক্সট লেখেন, প্রোগ্রামটি সেই সংখ্যাগুলো সংরক্ষণ করে; অন্য কেউ সেটি খুললে তার প্রোগ্রাম একই চুক্তি ব্যবহার করে সংখ্যাগুলোকে আবার অক্ষরে অনুবাদ করে। দুজনে একই ছক না ব্যবহার করলে টেক্সট ভুল দেখায়।
দুটি ধারণা আলাদা করতে হবে। একটি হলো অক্ষর সেট, অর্থাৎ কোন সংখ্যা কোন চিহ্নের সঙ্গে মেলে তার তালিকা। অন্যটি হলো সেই সংখ্যাগুলো বাইটে কীভাবে সংরক্ষণ হয়। ASCII-তে দুটি তুচ্ছভাবে মিলে যায়; Unicode-এ মেলে না, আর সেখানেই আসে UTF-8।
ASCII: 7 বিটের 128টি অক্ষর
ASCII (American Standard Code for Information Interchange-এর সংক্ষেপ) 1960-এর দশকে মান হিসেবে নির্ধারিত হয়। এটি 7 বিট ব্যবহার করে, অর্থাৎ 2^7 = 128টি কোড, 0 থেকে 127। এর মধ্যে 33টি কন্ট্রোল অক্ষর (0 থেকে 31 ও 127) এবং 95টি ছাপার যোগ্য (32 থেকে 126, ফাঁকা স্থান সহ)।
এতে উচ্চারণ চিহ্নযুক্ত অক্ষর, ñ বা ইউরো চিহ্ন নেই, এমনকি বাংলা অক্ষরও নেই: এটি ইংরেজির জন্য তৈরি। এ কারণেই পরে অন্য ছক দরকার হয়।
| কন্ট্রোল অক্ষর | দশমিক | হেক্সাডেসিমাল | বাইনারি (7 বিট) | কীসের জন্য |
|---|---|---|---|---|
| নাল (NUL) | 0 | 00 | 0000000 | কয়েকটি ভাষায় স্ট্রিংয়ের শেষ চিহ্নিত করে |
| অনুভূমিক ট্যাব (TAB) | 9 | 09 | 0001001 | পরের ট্যাব স্টপে যায় |
| লাইন ফিড (LF) | 10 | 0A | 0001010 | পরের লাইনে নামে |
| ক্যারেজ রিটার্ন (CR) | 13 | 0D | 0001101 | লাইনের শুরুতে ফেরে |
| এস্কেপ (ESC) | 27 | 1B | 0011011 | কন্ট্রোল ক্রম শুরু করে |
| ফাঁকা স্থান | 32 | 20 | 0100000 | প্রথম ছাপার যোগ্য অক্ষর |
| মুছুন (DEL) | 127 | 7F | 1111111 | অক্ষরটি মুছে ফেলে |
যে সম্পর্কগুলো মনে রাখা ভালো
ছকটি এলোমেলোভাবে সাজানো নয়। কয়েকটি নিয়ম জানলে কোড মুখস্থ পড়া যায়।
- «0» থেকে «9» অঙ্কগুলো 48 থেকে 57 পর্যন্ত (হেক্সাডেসিমালে 30 থেকে 39)। একটি অঙ্কের মান হলো তার কোড বিয়োগ 48: «7» হলো 55, আর 55 − 48 = 7।
- বড় হাতের অক্ষর 65 («A») থেকে 90 («Z») এবং ছোট হাতের 97 («a») থেকে 122 («z») পর্যন্ত।
- বড় হাতের অক্ষর ও তার ছোট হাতেরটির পার্থক্য সবসময় 32: «A» = 65 ও «a» = 97; «C» = 67 ও «c» = 99। বাইনারিতে শুধু একটি বিট বদলায়: «A»-এর জন্য 01000001 ও «a»-এর জন্য 01100001।
- কোনো বড় হাতের অক্ষর বর্ণমালায় কত নম্বরে তা জানতে 64 বিয়োগ করুন: «C» হলো 67 আর 67 − 64 = 3, তৃতীয় অক্ষর।
- সব বড় হাতের অক্ষরের (65 থেকে 90) কোড ছোট হাতেরগুলোর (97 থেকে 122) চেয়ে ছোট বলে «কোড অনুযায়ী» বর্ণানুক্রমে «Zebra» আসে «apple»-এর আগে। ঠিকভাবে সাজাতে অনেক প্রোগ্রামে আলাদা তুলনার বিকল্প লাগে।
লাইনের শেষ: LF, CR ও CRLF
নতুন লাইন সহজ মনে হলেও সিস্টেম অনুযায়ী আলাদাভাবে লেখা হয়। Unix, Linux ও macOS একটি মাত্র অক্ষর, LF (10) ব্যবহার করে। Windows পরপর দুটি ব্যবহার করে, CR ও LF (13 ও 10), যা CRLF নামে পরিচিত। পুরোনো টেলিপ্রিন্টারে দুটি আলাদা আদেশ লাগত: ক্যারেজ শুরুতে ফেরানো এবং কাগজ এক লাইন এগোনো।
এই পার্থক্যের কারণেই কোনো ফাইল সাধারণ এডিটরে পুরো একটি লাইনে দেখায়, বা প্রতি লাইনের শেষে একটি অদ্ভুত চিহ্ন থাকে। কোনটির কোড কত জানতে ASCII ছকের খোঁজ ঘরে LF বা CR লিখুন।
«এক্সটেন্ডেড ASCII» কোনো মান নয়
যেহেতু এক বাইটে 8 বিট আর ASCII ব্যবহার করে মাত্র 7, তাই 128টি কোড (128 থেকে 255) খালি থাকত এবং প্রতিটি নির্মাতা ও অঞ্চল সেগুলো নিজের মতো ভরেছে। একে «এক্সটেন্ডেড ASCII» বলা হয়, কিন্তু কোনো একক ছক নেই: অনেকগুলো আছে, যাদের বলা হয় কোড পেজ। সবচেয়ে পরিচিত দুটি হলো Latin-1 (ISO-8859-1), যেখানে é হলো কোড 233, এবং Windows-1252, যা একই রকম কিন্তু 128 থেকে 159 কোডে পার্থক্য আছে (সেখানেই যেমন ইউরো)।
সমস্যা হলো কোড 233 এক ছকে «é» বোঝায় আর অন্যটিতে অন্য কিছু। এক ছকে লেখা টেক্সট অন্য ছকে পড়লে আবর্জনা দেখাত। এই বিশৃঙ্খলা শেষ করতেই Unicode-এর জন্ম।
Unicode ও UTF-8
Unicode পৃথিবীর প্রায় সব লেখার পদ্ধতির প্রতিটি অক্ষরকে, সঙ্গে চিহ্ন ও ইমোজিকে, একটি অনন্য সংখ্যা দেয়, যাকে বলে কোড পয়েন্ট। আজ এতে 150,000-এর বেশি অক্ষর আছে। এটি লেখা হয় U+ উপসর্গ ও হেক্সাডেসিমালে: «A» হলো U+0041, «ñ» হলো U+00F1, ইউরো হলো U+20AC আর হাসিমুখ ইমোজি U+1F600। প্রথম 128টি কোড পয়েন্ট হুবহু ASCII-র।
UTF-8 হলো সেই সংখ্যাগুলো বাইটে সংরক্ষণের সবচেয়ে বেশি ব্যবহৃত উপায়, যা অক্ষর অনুযায়ী 1 থেকে 4 বাইট নেয়। ASCII-র 128টি আগের মতোই এক বাইট নেয়, তাই ASCII টেক্সট একটি বৈধ UTF-8 টেক্সটও। বাকিগুলো বেশি বাইট নেয়।
| অক্ষর | কোড পয়েন্ট | UTF-8-এ বাইট | বাইট (হেক্সাডেসিমাল) |
|---|---|---|---|
| A | U+0041 | 1 | 41 |
| é | U+00E9 | 2 | C3 A9 |
| ñ | U+00F1 | 2 | C3 B1 |
| € | U+20AC | 3 | E2 82 AC |
| 😀 | U+1F600 | 4 | F0 9F 98 80 |
«ñ»-এর জায়গায় কেন «Ã±» দেখা যায়
এটি সবচেয়ে সাধারণ ভুল এবং এর ব্যাখ্যা সুনির্দিষ্ট। UTF-8-এ ñ হলো দুই বাইট: C3 ও B1। কোনো প্রোগ্রাম মনে করলে টেক্সটটি Latin-1-এ আছে, সে প্রতিটি বাইটকে একেকটি অক্ষর হিসেবে পড়ে: C3 হয় «Ã» আর B1 হয় «±»। ফল: «Ã±»। «é» একইভাবে «Ã©» হিসেবে এবং «canción» «canción» হিসেবে দেখা যায়।
সমাধান প্রায় সবসময় প্রোগ্রামকে বলা যে ফাইলটি UTF-8 হিসেবে খুলতে হবে (টেক্সট এডিটরে বা স্প্রেডশিটের ইমপোর্ট সেটিংসে)। উল্টোটা ঘটলে, অর্থাৎ Latin-1 টেক্সট UTF-8 হিসেবে পড়লে, সাধারণত প্রশ্নচিহ্নসহ হীরার চিহ্ন দেখা যায়, কারণ ওই আলাদা বাইটগুলো বৈধ UTF-8 ক্রম গড়ে না।
ASCII টেবিল ও কনভার্টার কীভাবে ব্যবহার করবেন
«ASCII টেবিল» টুলটি 128টি অক্ষর দেখায় তাদের ডেসিমাল, হেক্সাডেসিমাল, অক্টাল ও বাইনারি কোড এবং কন্ট্রোল অক্ষরগুলোর নাম সহ।
- খোঁজ ঘরে একটি অক্ষর, একটি কোড বা কোনো কন্ট্রোল অক্ষরের নাম লিখুন (যেমন A, 65, 41 বা LF) তার সারি খুঁজে পেতে।
- শুধু একটি গ্রুপ দেখতে ফিল্টার বোতামগুলো (কন্ট্রোল, অঙ্ক, বড় হাতের, ছোট হাতের, চিহ্ন) ব্যবহার করুন।
- রূপান্তর করতে «টেক্সট» ঘরে একটি টেক্সট লিখুন এবং «কোডের ফরম্যাট» (ডেসিমাল, হেক্সাডেসিমাল, অক্টাল বা বাইনারি) বেছে নিন: নিচে কোডগুলো দেখা যায়। «Hola» ডেসিমালে দেয় 72 111 108 97 আর হেক্সাডেসিমালে 48 6F 6C 61।
- উল্টোটাও করতে পারেন: «কোড» ঘরে ফাঁকা স্থান বা কমা দিয়ে আলাদা করা কোড পেস্ট করুন, টেক্সট তৈরি হয়ে যাবে। হেক্সাডেসিমালে 0x41-এর মতো উপসর্গও চলে।
টেক্সটে ñ-এর মতো ASCII নয় এমন অক্ষর থাকলে টুলটি জানায় এবং তার Unicode কোড দেখায়। UTF-8-এর প্রকৃত বাইট দেখতে «টেক্সট থেকে বাইনারি» ব্যবহার করুন: ñ দেয় 11000011 10110001, 8 বিটের দুটি বাইট। সীমাবদ্ধতা: ছকটি শুধু আদর্শ ASCII দেখায়, এক্সটেন্ডেড নয়, আর সবকিছু আপনার ব্রাউজারেই হিসাব হয়, টেক্সট কোনো সার্ভারে পাঠানো হয় না।
সচরাচর জিজ্ঞাসা
ASCII-তে কয়টি অক্ষর আছে?
128টি, কোড 0 থেকে 127 এবং প্রতিটি 7 বিটের। এর মধ্যে 33টি কন্ট্রোল আর 95টি ছাপার যোগ্য, ফাঁকা স্থান সহ।
A আর a অক্ষরের ASCII কোড কত?
«A» হলো 65 (হেক্সাডেসিমালে 41, বাইনারিতে 01000001) আর «a» হলো 97 (হেক্সাডেসিমালে 61, বাইনারিতে 01100001)। এদের পার্থক্য সবসময় 32।
ASCII আর Unicode-এর মধ্যে পার্থক্য কী?
ASCII-তে ইংরেজির জন্য তৈরি 128টি অক্ষর আছে। Unicode-এ 150,000-এর বেশি আছে, প্রায় সব ভাষা ও ইমোজির, এবং এর প্রথম 128টি ASCII-র মতোই।
UTF-8 কী?
এটি Unicode টেক্সট বাইটে সংরক্ষণের সবচেয়ে বেশি ব্যবহৃত উপায়। প্রতি অক্ষরে 1 থেকে 4 বাইট লাগে: ASCII-র অক্ষর একটি, ñ দুটি আর ইমোজি চারটি।
আমার টেক্সটে কেন «Ã±» বা «Ã©» দেখাচ্ছে?
কারণ UTF-8-এ সংরক্ষিত একটি টেক্সট Latin-1 হিসেবে পড়া হচ্ছে। ফাইলটি UTF-8 এনকোডিং উল্লেখ করে খুললে সমস্যা মিটে যায়।