अलग-अलग टूल में कैरेक्टर की गिनती अलग क्यों आती है?
क्योंकि "कैरेक्टर" के तीन मतलब हो सकते हैं: बाइट (जो डेटाबेस कॉलम या HTTP बॉडी की सीमा मापती है), कोड पॉइंट (जो ज़्यादातर प्रोग्रामिंग भाषाएँ गिनती हैं) या ग्रैफ़ीम क्लस्टर (जो इंसान देखता है — स्किन टोन वाला इमोजी या मात्राओं वाला अक्षर एक ग्रैफ़ीम है पर कई कोड पॉइंट और उससे भी ज़्यादा बाइट)। Unicode ग्रैफ़ीम और शब्द सीमाएँ UAX #29 में परिभाषित करता है; जो लंबाई-वैलिडेशन ब्राउज़र में एक तरह और सर्वर पर दूसरी तरह गिनता है, वह अलग-अलग इनपुट स्वीकार या अस्वीकार करेगा।
स्ट्रिंग लेंथ काउंटर कैसे इस्तेमाल करें
- जिस स्ट्रिंग को मापना है उसे पेस्ट करें।
- पाँचों लंबाई के आँकड़ों की तुलना अपने सिस्टम की तय सीमा से करें।
- छिपे हुए या कॉम्बाइनिंग कैरेक्टर ढूँढ़ने के लिए ब्यौरे का इस्तेमाल करें।
स्ट्रिंग लेंथ काउंटर की खूबियाँ
- ग्राफ़ीम क्लस्टर, कोड पॉइंट, UTF-16 यूनिट और UTF-8 / UTF-16 बाइट साइज़ साथ-साथ
- सरोगेट पेयर, कॉम्बाइनिंग मार्क, ज़ीरो-विड्थ और कंट्रोल कैरेक्टर की पहचान
- हर कैरेक्टर का ब्यौरा — कोड पॉइंट, एन्कोडेड साइज़ और यूनिकोड श्रेणी सहित
- लिपि की पहचान (लैटिन, अरबी, देवनागरी, CJK, इमोजी…)
- टाइप या पेस्ट करते ही लाइव नतीजे
स्ट्रिंग लेंथ काउंटर का उदाहरण
इमोजी वाली स्ट्रिंग VARCHAR(10) कॉलम क्यों तोड़ देती है
इनपुट:
🚀👨👩👧 مرحباआउटपुट:
Graphemes 8 · Code points 12 · UTF-16 units 16 · UTF-8 bytes 33स्ट्रिंग लेंथ काउंटर के बारे में अक्सर पूछे जाने वाले सवाल
JavaScript मेरे डेटाबेस से अलग लंबाई क्यों बताता है?
JavaScript UTF-16 कोड यूनिट गिनता है, इसलिए एक इमोजी 2 होती है। MySQL का VARCHAR(n) कैरेक्टर (कोड पॉइंट) गिनता है, पर उसकी बाइट सीमा collation पर निर्भर करती है, और PostgreSQL कैरेक्टर गिनता है। यह टूल ये सभी आँकड़े साथ-साथ दिखाता है।
ग्राफ़ीम क्लस्टर क्या है?
वह इकाई जिसे पढ़ने वाला एक कैरेक्टर के रूप में देखता है। परिवार वाली इमोजी 👨👩👧 एक ग्राफ़ीम है पर पाँच कोड पॉइंट (तीन व्यक्ति, जिन्हें दो ज़ीरो-विड्थ जॉइनर जोड़ते हैं); "é" नॉर्मलाइज़ेशन के आधार पर एक या दो कोड पॉइंट हो सकता है।
UTF-8 साइज़ कैसे निकाला जाता है?
ASCII कैरेक्टर 1 बाइट लेते हैं, ज़्यादातर लैटिन/अरबी/हिब्रू अक्षर 2, देवनागरी और CJK 3, तथा इमोजी या अन्य astral कैरेक्टर 4 बाइट।
क्या ब्यौरे में अदृश्य कैरेक्टर दिखते हैं?
हाँ — ज़ीरो-विड्थ जॉइनर, BOM, कंट्रोल कैरेक्टर और कॉम्बाइनिंग मार्क अपने कोड पॉइंट के साथ सूचीबद्ध होते हैं, ताकि कॉपी किए गए टेक्स्ट में छिपे कैरेक्टर पकड़े जा सकें।
तकनीकी नोट्स
ग्राफ़ीम की गिनती Intl.Segmenter से होती है जब ब्राउज़र उसे उपलब्ध कराता है, वरना कोड पॉइंट पर लौट आती है। UTF-8 साइज़ TextEncoder से आता है, जो किसी भी इनपुट के लिए सटीक होता है — बिना जोड़े वाले सरोगेट सहित (जो U+FFFD के रूप में एन्कोड होते हैं)।
संदर्भ
- UAX #29: Unicode Text Segmentationटेक्स्ट को ग्रैफ़ीम क्लस्टर, शब्दों और वाक्यों में कैसे बाँटा जाता है — "कैरेक्टर" की गिनती कोड-पॉइंट या बाइट की गिनती से क्यों अलग हो सकती है।
- UAX #15: Unicode Normalization FormsNFC, NFD, NFKC और NFKD रूप — वजह कि दिखने में एक जैसी दो स्ट्रिंग नॉर्मलाइज़ किए बिना असमान निकल सकती हैं।
- RFC 3629: UTF-8, a transformation format of ISO 10646UTF-8 में कोड पॉइंट एक से चार बाइट में कैसे एन्कोड होते हैं, और कौन-सी बाइट सीक्वेंस अमान्य हैं।