ASCII ও Unicode: এগুলো কী এবং কীসের জন্য

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

হালনাগাদ:

অক্ষর এনকোডিং কী

এনকোডিং হলো একটি চুক্তি: «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, ফাঁকা স্থান সহ)।

এতে উচ্চারণ চিহ্নযুক্ত অক্ষর, ñ বা ইউরো চিহ্ন নেই, এমনকি বাংলা অক্ষরও নেই: এটি ইংরেজির জন্য তৈরি। এ কারণেই পরে অন্য ছক দরকার হয়।

যে কোডগুলো সবচেয়ে বেশি পাবেন। ফাঁকা স্থান (32) দেখা না গেলেও ছাপার যোগ্য হিসেবে গণ্য।
কন্ট্রোল অক্ষরদশমিকহেক্সাডেসিমালবাইনারি (7 বিট)কীসের জন্য
নাল (NUL)0000000000কয়েকটি ভাষায় স্ট্রিংয়ের শেষ চিহ্নিত করে
অনুভূমিক ট্যাব (TAB)9090001001পরের ট্যাব স্টপে যায়
লাইন ফিড (LF)100A0001010পরের লাইনে নামে
ক্যারেজ রিটার্ন (CR)130D0001101লাইনের শুরুতে ফেরে
এস্কেপ (ESC)271B0011011কন্ট্রোল ক্রম শুরু করে
ফাঁকা স্থান32200100000প্রথম ছাপার যোগ্য অক্ষর
মুছুন (DEL)1277F1111111অক্ষরটি মুছে ফেলে

যে সম্পর্কগুলো মনে রাখা ভালো

ছকটি এলোমেলোভাবে সাজানো নয়। কয়েকটি নিয়ম জানলে কোড মুখস্থ পড়া যায়।

লাইনের শেষ: 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 টেক্সটও। বাকিগুলো বেশি বাইট নেয়।

ASCII থেকে যত দূরে, অক্ষরটি তত বেশি বাইট নেয়।
অক্ষরকোড পয়েন্টUTF-8-এ বাইটবাইট (হেক্সাডেসিমাল)
AU+0041141
éU+00E92C3 A9
ñU+00F12C3 B1
€U+20AC3E2 82 AC
😀U+1F6004F0 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টি অক্ষর দেখায় তাদের ডেসিমাল, হেক্সাডেসিমাল, অক্টাল ও বাইনারি কোড এবং কন্ট্রোল অক্ষরগুলোর নাম সহ।

  1. খোঁজ ঘরে একটি অক্ষর, একটি কোড বা কোনো কন্ট্রোল অক্ষরের নাম লিখুন (যেমন A, 65, 41 বা LF) তার সারি খুঁজে পেতে।
  2. শুধু একটি গ্রুপ দেখতে ফিল্টার বোতামগুলো (কন্ট্রোল, অঙ্ক, বড় হাতের, ছোট হাতের, চিহ্ন) ব্যবহার করুন।
  3. রূপান্তর করতে «টেক্সট» ঘরে একটি টেক্সট লিখুন এবং «কোডের ফরম্যাট» (ডেসিমাল, হেক্সাডেসিমাল, অক্টাল বা বাইনারি) বেছে নিন: নিচে কোডগুলো দেখা যায়। «Hola» ডেসিমালে দেয় 72 111 108 97 আর হেক্সাডেসিমালে 48 6F 6C 61।
  4. উল্টোটাও করতে পারেন: «কোড» ঘরে ফাঁকা স্থান বা কমা দিয়ে আলাদা করা কোড পেস্ট করুন, টেক্সট তৈরি হয়ে যাবে। হেক্সাডেসিমালে 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 এনকোডিং উল্লেখ করে খুললে সমস্যা মিটে যায়।