सीधे कंटेंट पर जाएं

अक्षर गिनें

स्पेस के साथ और बिना, साथ में वह बाइट गिनती जो आपका डेटाबेस और SMS गेटवे असल में मापते हैं। यहां इमोजी एक कैरेक्टर गिना जाता है, क्योंकि वह यही है।

  • कभी स्टोर नहीं होती
  • न कतार, न इंतज़ार
  • साइनअप नहीं, वॉटरमार्क नहीं

0

कैरेक्टर

जो इंसान को दिखता है

0

स्पेस के बिना

ख़ाली जगह शामिल नहीं

0

शब्द

किसी भी भाषा में

0

UTF-8 बाइट

जो डेटाबेस गिनता है

हर गिनती, और उसका इस्तेमाल कहां होता है
लाइनेंजैसे एडिटर उन्हें नंबर देता है
0
वाक्य“Dr.” या “etc.” से नहीं टूटते
0
पैराग्राफ़ख़ाली लाइन से अलग किए गए हिस्से
0
कोड पॉइंटजिसे रेगुलर एक्सप्रेशन का “.” मैच करता है
0
UTF-16 यूनिटJavaScript में string.length जो बताता है
0
UTF-8 बाइटजिसे VARCHAR लिमिट और HTTP हेडर मापते हैं
0
पढ़ने का समयमन में, 238 शब्द प्रति मिनट की दर से
—
बोलने का समयबोलकर, 150 शब्द प्रति मिनट की दर से
—
सबसे लंबा शब्दकैरेक्टर के हिसाब से, बाइट के नहीं
—
औसत शब्दपढ़ने में आसानी का एक मोटा संकेत
—

टाइप करना शुरू करें और सब कुछ भर जाएगा। कोई इमोजी या चीनी भाषा का एक वाक्य आज़माएं — दोनों को वैसे ही गिना जाता है जैसे कोई इंसान गिनेगा, जिसमें ज़्यादातर काउंटर ग़लती करते हैं।

यह कैसे काम करता है

1

पेस्ट या टाइप करें

गिनती साथ-साथ अपडेट होती है। कुछ भी स्टोर नहीं किया जाता।

2

अपनी ज़रूरत की गिनती चुनें

कैरेक्टर, बिना स्पेस के कैरेक्टर, कोड पॉइंट या UTF-8 बाइट — हर एक दिखाया जाता है, इस जानकारी के साथ कि उसे कौन इस्तेमाल करता है।

3

अपनी सीमा पर नज़र रखें

SEO टाइटल, मेटा डिस्क्रिप्शन, SMS सेगमेंट और 255-बाइट का फ़ील्ड, सबको आपके लिखे टेक्स्ट से मिलाकर देखा जाता है।

चार आंकड़े, क्योंकि “कैरेक्टर” के चार मतलब हैं

परिवार वाला इमोजी लीजिए, या स्किन टोन वाला थम्स-अप। इंसान को एक कैरेक्टर दिखता है। यह कई कोड पॉइंट से बना है जो अदृश्य कनेक्टर से जुड़े हैं, इसलिए रेगुलर एक्सप्रेशन को सात दिखते हैं। JavaScript टेक्स्ट को 16-बिट यूनिट में रखता है और बेसिक रेंज से बाहर की हर चीज़ दो यूनिट लेती है, इसलिए वह ग्यारह बताता है। डेटाबेस कॉलम के लिए UTF-8 में एन्कोड करने पर यह पच्चीस बाइट लेता है। इनमें से कोई आंकड़ा ग़लत नहीं है और कोई भी अकेला जवाब नहीं है — सही आंकड़ा पूरी तरह इस पर निर्भर है कि सीमा कौन लगा रहा है।

तो असली सवाल यह है कि सीमा किसने लगाई। VARCHAR के रूप में घोषित डेटाबेस कॉलम ज़्यादातर इंजन में बाइट गिनता है, इसीलिए जो फ़ील्ड अंग्रेज़ी के 255 कैरेक्टर स्वीकार करता है, वह जापानी के उससे कहीं कम कैरेक्टर पर रिजेक्ट कर देता है। SMS अपनी सात-बिट वर्णमाला में 160 कैरेक्टर का होता है, और जैसे ही एक भी कैरेक्टर उससे बाहर का हो, प्रति मैसेज 70 पर आ जाता है — एक अकेला घुमावदार कोट या इमोजी एक मैसेज को तीन बना सकता है। JavaScript में फ़ॉर्म वैलिडेटर लगभग हमेशा UTF-16 यूनिट गिनता है, इसीलिए 280 कैरेक्टर बताने वाला फ़ील्ड इमोजी से भरी, छोटी दिखने वाली स्ट्रिंग भी रिजेक्ट कर सकता है।

पढ़ने वाले को जो दिखता है, उसकी गिनती सबसे मुश्किल है, और यह ब्राउज़र के अपने टेक्स्ट सेगमेंटेशन से की जाती है — वही तंत्र जो तय करता है कि बायां ऐरो दबाने पर आपका कर्सर कहां जाएगा। इंसान को दिखने वाली किसी भी चीज़ के लिए “एक कैरेक्टर” की यही सही परिभाषा है, और यह उन मामलों को संभालती है जिनमें सरल गिनती चूक जाती है: मूल अक्षर और जुड़ने वाले चिह्न से लिखा गया एक्सेंट वाला अक्षर एक गिना जाता है, और हिंदी और थाई के संयुक्त अक्षर वैसे ही गिने जाते हैं जैसे उन लिपियों का पाठक गिनेगा।

आम अंग्रेज़ी गद्य में चारों आंकड़े बिल्कुल बराबर होते हैं, इसीलिए यह समस्या तब तक दिखती नहीं जब तक सामने न आ जाए। इमोजी, एक्सेंट और जुड़ने वाले कैरेक्टर, ग़ैर-लैटिन लिपियों और गणितीय चिह्नों पर ये अलग हो जाते हैं — और यही वे इनपुट हैं जिनकी वजह से डेटाबेस बनने के तीन महीने बाद कोई फ़ील्ड चुपचाप कटने लगता है।

जब आपको कुछ और चाहिए

कोड में, डिफ़ॉल्ट लंबाई के बजाय ऐसा फ़ंक्शन इस्तेमाल करें जो वही गिने जो आपको चाहिए। 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 कोड यूनिट है, जिसमें वह परिवार वाला इमोजी 11 है। रेगुलर एक्सप्रेशन जिससे मैच करता है, वह कोड पॉइंट है, जिसमें यह 7 है। और डेटाबेस कॉलम या HTTP हेडर जो मापता है, वह UTF-8 बाइट है, जिसमें यह 25 है। चारों यहां दिखाए जाते हैं, क्योंकि आपको कौन-सा चाहिए, यह इस पर निर्भर है कि सीमा कौन लगा रहा है।

एक इमोजी कितने कैरेक्टर का होता है?

यहां, एक — क्योंकि पढ़ने वाले के लिए वह यही है, और किसी आधुनिक प्लेटफ़ॉर्म की कैरेक्टर सीमा भी यही गिनती है। दूसरी जगहों पर यह 2, 7 या 11 हो सकता है: “👨‍👩‍👧‍👦” चार लोग हैं जो तीन अदृश्य जोड़ने वाले कैरेक्टर से जुड़े हैं, इसलिए यह 7 कोड पॉइंट है और उन यूनिट में 11 जिन्हें JavaScript का string.length गिनता है। अगर किसी फ़ॉर्म ने आपका टेक्स्ट बहुत लंबा बताकर रिजेक्ट किया जबकि वह छोटा दिख रहा था, तो आम तौर पर वजह यही है, और इस पेज पर बाइट गिनती आपको असली साइज़ दिखा देगी।

मेरा 200 कैरेक्टर का टेक्स्ट 255 कैरेक्टर वाले डेटाबेस फ़ील्ड में फ़ेल क्यों हुआ?

क्योंकि वह फ़ील्ड लगभग पक्का कैरेक्टर नहीं, बाइट की सीमा लगाता है। UTF-8 में सादे अंग्रेज़ी अक्षर एक-एक बाइट लेते हैं, पर एक्सेंट वाले अक्षर दो, और चीनी, जापानी, अरबी और इमोजी तीन या चार। इसलिए जापानी के 200 कैरेक्टर 600 बाइट हैं। ठीक इसी वजह से यहां बाइट गिनती दिखाई जाती है — यही वह आंकड़ा है जिसे आपका डेटाबेस असल में जांचता है।

एक इमोजी से मेरी SMS सीमा 160 से 70 क्यों हो जाती है?

क्योंकि टेक्स्ट मैसेज एक छोटी 7-बिट वर्णमाला इस्तेमाल करता है जिसमें 160 कैरेक्टर आते हैं — और उस वर्णमाला में न इमोजी है, न घुमावदार कोट, और लगभग कोई एक्सेंट नहीं। उससे बाहर का एक भी कैरेक्टर पूरे मैसेज को Unicode पर ले जाता है, और सीमा 70 रह जाती है। Word से पेस्ट किया गया घुमावदार एपॉस्ट्रॉफ़ी भी उतनी ही आसानी से यह कर देता है जितना इमोजी। इसी तरह एक छोटे मैसेज का बिल तीन मैसेज का बनता है, और जैसे ही ऐसा होता है, पेज आपको बता देता है।

क्या यह स्पेस गिनता है?

दोनों आंकड़े एक साथ दिखाए जाते हैं, इसलिए आपको चुनना नहीं पड़ता। लाइन ब्रेक और टैब भी व्हाइटस्पेस गिने जाते हैं।

ध्यान दें: चार आंकड़े, क्योंकि “कैरेक्टर” के चार मतलब हैं और आपको कौन-सा चाहिए, यह इस पर निर्भर है कि सीमा कौन लगा रहा है। डेटाबेस का VARCHAR UTF-8 बाइट गिनता है, रेगुलर एक्सप्रेशन कोड पॉइंट गिनता है, JavaScript UTF-16 यूनिट गिनता है, और इंसान वह गिनता है जो उसे दिखता है। इमोजी पर ये सबसे ज़्यादा अलग होते हैं।

यह टूल अपनी वेबसाइट पर लगाएं

किसी भी ब्लॉग, क्लास पेज या हेल्प आर्टिकल के लिए मुफ़्त। एक स्निपेट पेस्ट करें और आपके विज़िटर इसे सीधे आपके पेज पर इस्तेमाल कर सकेंगे।