অক্ষর গণনা করুন
স্পেসসহ ও স্পেস ছাড়া, সঙ্গে সেই বাইট সংখ্যা, যা আপনার ডেটাবেস আর SMS গেটওয়ে আসলে মাপে। এখানে ইমোজি এক অক্ষর হিসেবে গোনা হয়, কারণ আসলে সেটিই।
- কখনো সংরক্ষণ করা হয় না
- কোনো লাইন নেই, অপেক্ষা নেই
- সাইনআপ নেই, ওয়াটারমার্ক নেই
0
অক্ষর
মানুষ যা দেখে
0
স্পেস ছাড়া
ফাঁকা জায়গা বাদে
0
শব্দ
যেকোনো ভাষায়
0
UTF-8 বাইট
ডেটাবেস যা গোনে
- লাইনএডিটর যেভাবে নম্বর দেয়
- 0
- বাক্য“Dr.” বা “etc.”-এ ভাঙে না
- 0
- অনুচ্ছেদফাঁকা লাইন দিয়ে আলাদা করা অংশ
- 0
- কোড পয়েন্টরেগুলার এক্সপ্রেশনের “.” যা মেলায়
- 0
- UTF-16 ইউনিটJavaScript-এ string.length যা দেখায়
- 0
- UTF-8 বাইটVARCHAR সীমা আর HTTP হেডার যা মাপে
- 0
- পড়ার সময়মনে মনে, মিনিটে ২৩৮ শব্দ হারে
- —
- বলার সময়জোরে, মিনিটে ১৫০ শব্দ হারে
- —
- সবচেয়ে লম্বা শব্দঅক্ষর ধরে, বাইট নয়
- —
- গড় শব্দপাঠযোগ্যতার একটি মোটামুটি ইঙ্গিত
- —
লিখতে শুরু করুন, সব ঘর ভরে যাবে। একটি ইমোজি বা চীনা ভাষার একটি বাক্য লিখে দেখুন — দুটোই মানুষ যেভাবে গোনে সেভাবে গোনা হয়, যা বেশির ভাগ কাউন্টার ভুল করে।
যেভাবে কাজ করে
পেস্ট করুন বা লিখুন
লিখতে লিখতেই গণনা আপডেট হয়। কিছুই সংরক্ষণ করা হয় না।
দরকারি সংখ্যাটি বেছে নিন
অক্ষর, স্পেস ছাড়া অক্ষর, কোড পয়েন্ট বা UTF-8 বাইট — প্রতিটি দেখানো হয়, কোনটি কোথায় ব্যবহৃত হয় তা-সহ।
সীমার দিকে নজর রাখুন
SEO টাইটেল, মেটা ডিসক্রিপশন, SMS সেগমেন্ট আর ২৫৫-বাইটের একটি ফিল্ড — সবই আপনার লেখার সঙ্গে মিলিয়ে দেখানো হয়।
চারটি সংখ্যা, কারণ “অক্ষর”-এর চারটি অর্থ
একটি পরিবারের ইমোজি, বা স্কিন টোনসহ থাম্বস-আপের কথা ধরুন। মানুষ দেখে একটি অক্ষর। এটি অদৃশ্য সংযোগকারী দিয়ে জোড়া কয়েকটি কোড পয়েন্টে তৈরি, তাই রেগুলার এক্সপ্রেশন দেখে সাতটি। JavaScript টেক্সট রাখে ১৬-বিট ইউনিটে, আর বেসিক রেঞ্জের বাইরের যেকোনো কিছু দুটি ইউনিট নেয়, তাই সে জানায় এগারোটি। ডেটাবেস কলামের জন্য UTF-8-এ এনকোড করলে এটি নেয় পঁচিশ বাইট। এর কোনো সংখ্যাই ভুল নয়, আবার কোনোটিই একমাত্র উত্তর নয় — কোনটি ঠিক, তা পুরোপুরি নির্ভর করে সীমা কে বেঁধে দিচ্ছে তার ওপর।
তাই বাস্তব প্রশ্ন হলো, সীমাটি কে আরোপ করেছে। VARCHAR হিসেবে ঘোষিত ডেটাবেস কলাম বেশিরভাগ ইঞ্জিনে বাইট গোনে, আর এ কারণেই যে ফিল্ড ২৫৫টি ইংরেজি অক্ষর নেয়, সেটি তার চেয়ে অনেক কম জাপানি অক্ষরেই প্রত্যাখ্যান করে। একটি SMS তার নিজস্ব সাত-বিট বর্ণমালায় ১৬০ অক্ষরের, আর একটি অক্ষরও সেই বর্ণমালার বাইরে পড়লে সঙ্গে সঙ্গে মেসেজপ্রতি ৭০-এ নেমে আসে — একটিমাত্র বাঁকা উদ্ধৃতিচিহ্ন বা ইমোজি একটি মেসেজকে তিনটিতে পরিণত করতে পারে। JavaScript-এ লেখা ফর্ম ভ্যালিডেটর প্রায় সবসময় UTF-16 ইউনিট গোনে, আর এ কারণেই ২৮০ অক্ষরের কথা বলা একটি ফিল্ড ইমোজিতে ভরা, দেখতে ছোট একটি লেখাও প্রত্যাখ্যান করতে পারে।
পাঠক যা দেখেন তার সংখ্যাই সবচেয়ে কঠিন, আর তা গোনা হয় ব্রাউজারের নিজস্ব টেক্সট সেগমেন্টেশন দিয়ে — সেই একই ব্যবস্থা, যা ঠিক করে বাম অ্যারো কি চাপলে কার্সর কোথায় যাবে। মানুষ যা দেখে, তার ক্ষেত্রে “একটি অক্ষর”-এর সঠিক সংজ্ঞা এটিই, আর সরল গণনা যেখানে হোঁচট খায়, সেগুলোও এটি সামলায়: মূল অক্ষর আর যুক্ত চিহ্ন দিয়ে লেখা অ্যাকসেন্টযুক্ত অক্ষর একটিই, আর হিন্দি ও থাই যুক্তবর্ণ গোনা হয় সেই লিপির পাঠক যেভাবে গোনেন, সেভাবে।
সাধারণ ইংরেজি গদ্যে চারটি সংখ্যাই এক, আর এ কারণেই সমস্যাটি ধরা পড়ার আগ পর্যন্ত অদৃশ্য থাকে। ইমোজি, অ্যাকসেন্টযুক্ত ও যুক্ত অক্ষর, অ-লাতিন লিপি আর গাণিতিক চিহ্নে এগুলো আলাদা হয়ে যায় — আর ঠিক এই ইনপুটগুলোই তৈরির তিন মাস পর ডেটাবেসের কোনো ফিল্ডকে নিঃশব্দে কেটে ছোট করে দেয়।
অন্য কিছু দরকার হলে
কোডে ডিফল্ট length নয়, আপনার যা দরকার তা-ই গোনে এমন ফাংশন ব্যবহার করুন। JavaScript-এ Intl.Segmenter গোনে পাঠক যা দেখেন; Python 3-এর স্ট্রিং গোনে কোড পয়েন্ট, আর len(s.encode("utf-8")) গোনে বাইট; PHP-তে ঠিক এই পার্থক্যের জন্যই আছে mb_strlen আর strlen। বেশিরভাগ ভাষার ডিফল্ট হলো ভাষাটির কাছে যেটি সুবিধাজনক, আর তা খুব কমই আপনার সীমার আসল অর্থ।
সীমা যখন ডেটাবেস ফিল্ডের, তখন স্থায়ী সমাধান আরও গোড়ায়। MySQL-এ কলামকে utf8mb4, বা PostgreSQL-এ text হিসেবে ঘোষণা করলে এক ধরনের পুরো কাটা-পড়া বাগই দূর হয় — MySQL-এর পুরোনো utf8 কুখ্যাতভাবে অক্ষরপ্রতি মাত্র তিন বাইট, আর তাতে কোনো ইমোজিই রাখা যায় না। ফর্মে সাবধানে গোনা আসলে এমন একটি কলামের জোড়াতালি, যা শুরুতেই অন্যভাবে ঘোষণা করা উচিত ছিল।
সাধারণ প্রশ্নোত্তর
আমার লেখা কি কোথাও সংরক্ষণ করা হয়?
না। কিছুই সংরক্ষণ করা হয় না, কোনো রিকোয়েস্টও পাঠানো হয় না, আর ইন্টারনেট সংযোগ বিচ্ছিন্ন থাকলেও এটি কাজ করে। লেখার ক্ষেত্রে এর গুরুত্ব যতটা মনে হয় তার চেয়ে বেশি: মানুষ অনলাইন কাউন্টারে যা পেস্ট করে, তা হলো অপ্রকাশিত লেখা, আইনি খসড়া, শিক্ষার্থীদের কাজ আর অভ্যন্তরীণ ডকুমেন্ট।
অক্ষরের চারটি আলাদা সংখ্যা কেন?
কারণ “অক্ষর”-এর চারটি আলাদা অর্থ আছে, আর বেশিরভাগ টুল জানে মাত্র একটি। আপনি যাকে একটি অক্ষর হিসেবে দেখেন, তা একটি গ্রাফিম ক্লাস্টার — “é”, “🎉” এমনকি “👨👩👧👦”-ও প্রতিটি একটি। JavaScript-এর string.length যা জানায়, তা UTF-16 কোড ইউনিট, যেখানে ওই পরিবারের ইমোজি ১১। রেগুলার এক্সপ্রেশন যা মেলায়, তা কোড পয়েন্ট, যেখানে এটি ৭। আর ডেটাবেস কলাম বা HTTP হেডার যা মাপে, তা UTF-8 বাইট, যেখানে এটি ২৫। চারটিই এখানে দেখানো হয়, কারণ আপনার কোনটি দরকার তা নির্ভর করে সীমা কে বেঁধে দিচ্ছে তার ওপর।
একটি ইমোজি কত অক্ষর?
এখানে একটি — কারণ যিনি পড়ছেন তাঁর কাছে এটি তা-ই, আর আধুনিক প্ল্যাটফর্মের অক্ষর সীমাও এভাবেই গোনে। অন্য জায়গায় এটি ২, ৭ বা ১১ হতে পারে: “👨👩👧👦” হলো তিনটি অদৃশ্য সংযোগকারী অক্ষর দিয়ে জোড়া চারজন মানুষ, তাই এটি ৭টি কোড পয়েন্ট, আর JavaScript-এর string.length যে ইউনিট গোনে, তার ১১টি। দেখতে যথেষ্ট ছোট হওয়া সত্ত্বেও কোনো ফর্ম আপনার লেখাকে বেশি লম্বা বলে প্রত্যাখ্যান করলে সাধারণত কারণ এটিই, আর এই পেজের বাইট সংখ্যা আপনাকে আসল সাইজ দেখাবে।
২০০ অক্ষরের লেখা ২৫৫ অক্ষরের ডেটাবেস ফিল্ডে আটকে গেল কেন?
কারণ ফিল্ডটি প্রায় নিশ্চিতভাবেই অক্ষর নয়, বাইট সীমিত করে। UTF-8-এ সাধারণ ইংরেজি অক্ষর একটি করে বাইট নেয়, কিন্তু অ্যাকসেন্টযুক্ত অক্ষর নেয় দুটি, আর চীনা, জাপানি, আরবি ও ইমোজি নেয় তিন বা চারটি। তাই ২০০ অক্ষরের জাপানি লেখা মানে ৬০০ বাইট। ঠিক এ কারণেই এখানে বাইট সংখ্যা দেখানো হয় — আপনার ডেটাবেস আসলে এই সংখ্যাটিই যাচাই করে।
একটি ইমোজিতে আমার SMS সীমা ১৬০ থেকে ৭০-এ নামে কেন?
কারণ টেক্সট মেসেজ একটি সংক্ষিপ্ত ৭-বিট বর্ণমালা ব্যবহার করে, যাতে ১৬০ অক্ষর ধরে — আর সেই বর্ণমালায় কোনো ইমোজি নেই, বাঁকা উদ্ধৃতিচিহ্ন নেই, অ্যাকসেন্টও প্রায় নেই। এর বাইরের একটিমাত্র অক্ষর পুরো মেসেজকে Unicode-এ বদলে দেয়, আর সীমা নেমে আসে ৭০-এ। Word থেকে পেস্ট করা একটি বাঁকা অ্যাপোস্ট্রফিও ইমোজির মতোই সহজে এটি ঘটায়। এভাবেই একটি ছোট মেসেজের বিল হয় তিনটির, আর যে মুহূর্তে এটি ঘটে, পেজটি আপনাকে জানিয়ে দেয়।
স্পেস কি গোনা হয়?
দুটি সংখ্যাই একসাথে দেখানো হয়, তাই আপনাকে বেছে নিতে হয় না। লাইন ব্রেক আর ট্যাবও হোয়াইটস্পেস হিসেবে গোনা হয়।
জেনে রাখুন: চারটি সংখ্যা, কারণ “অক্ষর”-এর চারটি অর্থ আছে, আর আপনার কোনটি দরকার তা নির্ভর করে সীমা কে বেঁধে দিচ্ছে তার ওপর। ডেটাবেসের VARCHAR গোনে UTF-8 বাইট, রেগুলার এক্সপ্রেশন গোনে কোড পয়েন্ট, JavaScript গোনে UTF-16 ইউনিট, আর মানুষ গোনে যা চোখে দেখে। সবচেয়ে বেশি অমিল হয় ইমোজিতে।
এই টুলটি আপনার ওয়েবসাইটে যোগ করুন
যেকোনো ব্লগ, ক্লাসের পেজ বা হেল্প আর্টিকেলের জন্য ফ্রি। একটি স্নিপেট পেস্ট করলেই আপনার ভিজিটররা আপনার পেজেই এটি ব্যবহার করতে পারবেন।
সম্পর্কিত টুল
শব্দ গণনা (ওয়ার্ড কাউন্টার)
শব্দ, বাক্য আর পড়তে কত সময় লাগবে
টেক্সট তুলনা
দুই সংস্করণের মধ্যে ঠিক কী বদলেছে, দেখুন
কেস কনভার্টার
UPPER, lower, Title Case, camelCase ও বাকিগুলো
Base64 এনকোড
টেক্সট বা ফাইলকে Base64-এ রূপান্তর করুন
ডুপ্লিকেট লাইন রিমুভ
পুনরাবৃত্তি সরান, তালিকা সাজান ও গুছিয়ে নিন
HTML মিনিফায়ার
পেজ না ভেঙে HTML ছোট করুন