FlowingDev

Fonts, explained: उस छोटे से सॉफ़्टवेयर को डिकोड करना जो हमारे शब्द ड्रॉ करता है

डिजिटल fonts की एनाटॉमी समझें, TTF और WOFF2 से लेकर variable axes तक, और जानें कि glyphs, kerning और metadata कैसे वेब की typography को शेप देते हैं।

टूल आज़माएँ: Font Inspector और Glyph Viewer

एक लाइन में

डिजिटल fonts सिर्फ छोटी तस्वीरों का कलेक्शन नहीं हैं; वे complex, executable सॉफ़्टवेयर पैकेजेज़ हैं जो vector math, copyright के कानूनी पचड़ों और छिपे हुए substitution rules से भरे होते हैं।

यह कौन सी प्रॉब्लम सॉल्व करता है

अगर आप ध्यान दें, तो लेटर्स एक बहुत ही सब्जेक्टिव कॉन्सेप्ट हैं। जब किसी कंप्यूटर को बाइट सीक्वेंस 0x41 मिलता है, तो उसे पता होता है कि इसका मतलब "A" है। लेकिन एक "A" दिखता कैसा है? क्या इसमें serifs हैं? क्या यह मोटा है? क्या यह तिरछा है?

डिजिटल स्क्रीन्स से पहले, typography बिल्कुल फिजिकल थी। प्रिंटर्स सीसे (lead) के फिजिकल ब्लॉक्स को अरेंज करते थे। जब डिजिटल युग आया, तो हमें पिक्सल्स को यह बताने का कोई तरीका चाहिए था कि इन शेप्स को कैसे ड्रॉ करना है। शुरुआत में, हमने bitmap fonts का इस्तेमाल किया—जो सचमुच पिक्सल्स के ग्रिड थे—लेकिन जैसे ही आप उन्हें स्केल अप करते, वे आड़ी-तिरछी सीढ़ियों जैसे (jagged) दिखने लगते थे।

1980 के दशक के आखिर और 90 के दशक की शुरुआत में, Apple और Microsoft ने Adobe के proprietary PostScript (Type 1) फॉर्मेट से मुकाबला करने के लिए मिलकर TrueType (TTF) बनाया। यहीं से "font wars" की शुरुआत हुई। जिस सॉल्यूशन पर वे आखिरकार सहमत हुए वह था OpenType (OTF), एक ऐसा फॉर्मेट जिसने दोनों अप्रोच को मिला दिया। बाद में, इन फाइल्स को वेब-फ्रेंडली बनाने के लिए, हमने इन्हें WOFF और WOFF2 में कम्प्रेस कर दिया।

आज डेवलपर्स के लिए प्रॉब्लम यह है कि fonts ब्लैक बॉक्स की तरह काम करते हैं। आप अपनी CSS में font-family: 'Inter'; लिखते तो हैं, लेकिन आप अंधेरे में तीर चला रहे होते हैं। क्या इस फाइल में वाकई Cyrillic कैरेक्टर्स हैं? क्या इसका लाइसेंस कमर्शियल ऐप में एम्बेड करने की परमिशन देता है? क्या यह मॉडर्न variable font axes को सपोर्ट करता है, या आप बस CSS के जरिए नकली (fake) bold वेट दिखा रहे हैं? इन सवालों के जवाब पाने के लिए, आपको फॉन्ट फाइल के अंदर झांकने, उसके metadata को अनपैक करने और उसकी इंटरनल ज्योमेट्री को inspect करने के लिए एक एक्स-रे मशीन की जरूरत होती है।

यह अंदर कैसे काम करता है

एक मॉडर्न फॉन्ट फाइल (चाहे TTF, OTF, या WOFF2 हो) असल में एक highly optimized, बाइनरी रिलेशनल डेटाबेस होती है। यह SFNT कंटेनर फॉर्मेट पर बनी होती है, जो डेटा को अलग-अलग "tables" में ऑर्गेनाइज़ करता है, और हर टेबल की पहचान एक 4-लेटर टैग से होती है।

एक OpenType Font की एनाटॉमी

जब कोई फॉन्ट इंस्पेक्टर किसी फाइल को पार्स करता है, तो वह इन स्पेसिफिक टेबल्स को लोकेट करने के लिए एक सेंट्रल डायरेक्टरी को रीड करता है:

Tag Name यह क्या करता है
cmap Character to Glyph Mapping ट्रांसलेटर। यह एक Unicode वैल्यू (जैसे "A" के लिए U+0041) को एक स्पेसिफिक इंटरनल Glyph ID से मैप करता है।
glyf Glyph Data असली वेक्टर आउटलाइन्स जो TrueType fonts में यूज़ होती हैं (quadratic Bézier curves)।
CFF Compact Font Format वेक्टर आउटलाइन्स जो PostScript-फ्लेवर्ड OpenType fonts में यूज़ होती हैं (cubic Bézier curves)।
name Naming Table मेटाडेटा: फॉन्ट फैमिली, डिज़ाइनर, कॉपीराइट नोटिस, और लाइसेंस URLs।
kern Kerning लेटर्स के स्पेसिफिक पेयर्स की स्पेसिंग के रूल्स (जैसे एक छोटे 'o' को कैपिटल 'T' के नीचे टक करना)।
GSUB Glyph Substitution एडवांस्ड टाइपोग्राफी रूल्स, जैसे 'f' और 'i' को मिलाकर एक सिंगल 'fi' ligature बना देना।

Characters बनाम Glyphs

समझने के लिए सबसे बेसिक कॉन्सेप्ट characters और glyphs के बीच का अंतर है।

  • एक character एक सिमेंटिक कॉन्सेप्ट (Unicode) है। इसका मतलब है "लोअरकेस g का आइडिया"।
  • एक glyph एक ड्रॉइंग है। यह फॉन्ट में स्टोर किया गया स्पेसिफिक वेक्टर शेप होता है।

एक character मल्टीपल glyphs से मैप हो सकता है (जैसे एक स्टैण्डर्ड 'g' और एक फैंसी स्वैश 'g')। इसके उलट, मल्टीपल characters एक सिंगल glyph से भी मैप हो सकते हैं (जैसे जब f और i characters को एक सिंगल ligature glyph fi से रिप्लेस कर दिया जाता है)। cmap और GSUB टेबल्स इस बेहद कॉम्प्लेक्स राउटिंग को हैंडल करती हैं।

Variable Fonts

पहले के समय में, अगर आपको Regular, Bold, और Italic टाइपफेस चाहिए होता था, तो आपको तीन अलग-अलग फाइल्स लोड करनी पड़ती थीं। 2016 में OpenType एक्सटेंशन के रूप में आए Variable Fonts ने पूरा गेम ही बदल दिया।

स्टैटिक आउटलाइन्स के बजाय, एक variable font एक मास्टर आउटलाइन और mathematical deltas का एक सेट स्टोर करता है (fvar और gvar टेबल्स में)। ये deltas अलग-अलग axes के अलोंग एक इंटरपोलेशन "डिज़ाइन स्पेस" को डिफाइन करते हैं।

पांच स्टैण्डर्ड axes ये हैं:

  • wght: Weight (Thin से Black तक)
  • wdth: Width (Condensed से Expanded तक)
  • ital: Italic (On या Off)
  • slnt: Slant (लेटर्स का एंगल)
  • opsz: Optical Size (फॉन्ट कितना बड़ा डिस्प्ले हो रहा है, उसके हिसाब से शेप्स को ट्विक करना)

CSS में, एक variable font axis की मैपिंग कुछ इस तरह दिखती है:

/* Setting a custom weight of 430 and a slight slant */
h1 {
  font-family: 'MyVariableFont', sans-serif;
  font-variation-settings: 'wght' 430, 'slnt' -5;
}

वेब कम्प्रेशन (WOFF2)

WOFF2 (Web Open Font Format 2) बुनियादी तौर पर कोई नया फॉन्ट टाइप नहीं है; यह बस एक TTF या OTF फाइल के चारों ओर एक कम्प्रेशन रैपर है। यह Brotli कम्प्रेशन एल्गोरिथम का यूज़ करता है, जिसे खासतौर पर SFNT टेबल स्ट्रक्चर को समझने के लिए ऑप्टिमाइज़ किया गया है, जिसके नतीजे में ओरिजिनल WOFF की तुलना में फाइल साइज़ लगभग 30% छोटे हो जाते हैं। जब ब्राउज़र एक WOFF2 डाउनलोड करता है, तो यह ग्राफिक्स इंजन को सौंपने से पहले इसे चुपचाप मेमोरी में वापस एक स्टैण्डर्ड OpenType फॉन्ट में डीकम्प्रेस कर देता है।

रियल-वर्ल्ड कहानियां

अदृश्य Cyrillic सेबोटाज (The Invisible Cyrillic Sabotage)

एक फ्रंटएंड डेवलपर को एक ट्रेंडी ओपन-सोर्स टाइपफेस का यूज़ करके एक ग्लोबल मार्केटिंग साइट बनाने का काम सौंपा गया। इंग्लिश और स्पैनिश में सब कुछ पिक्सल-परफेक्ट लग रहा था। हालाँकि, जब लोकलाइज़ेशन टीम ने CMS में रशियन कंटेंट डाला, तो वह खूबसूरत sans-serif अचानक एक भद्दे, अनस्टाइल्ड Times New Roman फॉलबैक में बदल गया।

डेवलपर ने यह मान लिया था कि चूंकि फॉन्ट "मॉडर्न" है, इसलिए यह सभी प्रमुख भाषाओं को सपोर्ट करता होगा। cmap टेबल को inspect करने से कड़वी सच्चाई सामने आई: फॉन्ट में सिर्फ ASCII और बेसिक Latin glyphs थे। Cyrillic Unicode ब्लॉक्स पूरी तरह से खाली थे। इससे क्या सबक मिला? बिना खुद glyph कवरेज चेक किए किसी फॉन्ट के लैंग्वेज सपोर्ट पर आँख मूंदकर भरोसा न करें।

3 मेगाबाइट की बड़ी गलती

एक डिज़ाइन एजेंसी ने एक महत्वाकांक्षी वेब प्रोजेक्ट सौंपा जिसमें एक कस्टम ब्रांड फॉन्ट के नौ अलग-अलग वेट्स (Hairline से लेकर UltraBlack तक) शामिल थे। डेवलपर ने बड़ी लगन से सभी नौ .ttf फाइल्स को CSS में लोड कर दिया। इसका नतीजा यह हुआ कि सिर्फ टाइपोग्राफी के लिए 3MB का भारी-भरकम पेलोड बन गया, जिससे मोबाइल नेटवर्क्स पर रेंडरिंग में भारी देरी होने लगी।

फॉन्ट फैमिली के सोर्स को inspect करके, डेवलपर को उसी टाइपफेस का एक सिंगल, variable font वर्ज़न (.woff2) मिला। नौ स्टैटिक फाइल्स को हटाकर उसकी जगह एक variable font लगाने से, उन्होंने पेलोड को घटाकर 120KB कर दिया। इससे न सिर्फ परफॉरमेंस आसमान छूने लगी, बल्कि वे होवर स्टेट्स (hover states) पर wght एक्सिस को स्मूथली एनिमेट करने में भी कामयाब रहे।

लाइसेंस का लीगल फंदा

एक स्टार्टअप अपना नया iOS ऐप लॉन्च करने की जल्दबाजी में था। UI डिज़ाइनर ने प्राइमरी बटन्स के लिए किसी रैंडम टाइपोग्राफी ब्लॉग से एक "फ्री" फॉन्ट उठा लिया था। ऐप स्टोर में सबमिशन से दो दिन पहले, एक सीनियर इंजीनियर ने फॉन्ट के मेटाडेटा को inspect करने का फैसला किया।

name टेबल के अंदर, साफ-साफ एक स्ट्रिंग लिखी थी जो $5,000 के कमर्शियल लाइसेंस के बिना कम्पाइल्ड मोबाइल एप्लिकेशन्स में फॉन्ट को एम्बेड करने से रोकती थी। इस छिपे हुए EULA (End User License Agreement) को पकड़ने से स्टार्टअप संभावित कॉपीराइट मुकदमों और ऐप के ज़बरदस्ती टेकडाउन से बच गया। Fonts सॉफ़्टवेयर हैं, और वे अपनी बाइनरी फाइल्स के ठीक अंदर लीगल बैगेज कैरी करते हैं।

कॉमन गलतियाँ और ट्रैप्स

  • Bold और italic को फेक करना: अगर आप CSS में font-weight: bold; या font-style: italic; अप्लाई करते हैं, लेकिन असल में bold/italic फॉन्ट फाइल्स को लोड नहीं किया है, तो ब्राउज़र रेगुलर फॉन्ट को सिंथेटिक तरीके से फैला या तिरछा कर देगा। यह "faux-bolding" डिज़ाइनर के बड़ी मेहनत से बनाए गए वेक्टर शेप्स को बर्बाद कर देता है और बहुत ही भद्दा दिखता है।
  • लाइसेंस को इग्नोर करना: सिर्फ इसलिए कि आप .ttf फाइल डाउनलोड कर सकते हैं, इसका मतलब यह नहीं है कि आपको इसे वेब पर सर्व करने या किसी ऐप में बंडल करने का अधिकार मिल गया है। हमेशा मेटाडेटा पढ़ें।
  • Bloated subsets शिप करना: कई पॉपुलर fonts में उन भाषाओं के हजारों glyphs होते हैं जिन्हें आप शायद कभी सर्व भी न करें। जब आपको सिर्फ इंग्लिश कैरेक्टर्स की जरूरत हो तो 400KB की फॉन्ट फाइल शिप करना बैंडविड्थ की सरासर बर्बादी है। आपको फॉन्ट का ब्लोट (bloat) देखने के लिए उसे inspect करना चाहिए, फिर बिना यूज़ होने वाले glyphs को हटाने के लिए किसी subsetting टूल का यूज़ करना चाहिए।
  • यह मान लेना कि OpenType फीचर्स बाय-डिफ़ॉल्ट इनेबल्ड हैं: कई fonts में खूबसूरत ligatures, alternate character styles, या tabular numbers (जहाँ हर नंबर की विड्थ बिल्कुल सेम होती है, जो प्राइसिंग टेबल्स के लिए परफेक्ट है) होते हैं। लेकिन ये अक्सर liga या tnum जैसे OpenType टैग्स के पीछे छिपे होते हैं। अगर आप फॉन्ट को inspect करके यह नहीं जानते कि वे मौजूद हैं, तो आप अपनी CSS में font-feature-settings का यूज़ करके उन्हें एक्टिवेट नहीं कर सकते।

यह आपके रडार पर क्यों होना चाहिए

टाइपोग्राफी वेब का बिल्कुल कोर हिस्सा है; किसी टिपिकल वेबसाइट का 90% तक डिज़ाइन सिर्फ टेक्स्ट होता है। एक डेवलपर के रूप में, fonts को सिर्फ एक जादुई टेक्स्ट-स्टाइलिंग डस्ट समझना परफॉरमेंस इश्यूज़ और लेआउट बग्स को दावत देना है।

जब भी आप वेब परफॉरमेंस को ऑप्टिमाइज़ कर रहे हों, तो आपको फॉन्ट इन्स्पेक्शन के बारे में सोचना चाहिए। बड़ी फॉन्ट फाइल्स Cumulative Layout Shift (CLS) और डरावने Flash of Unstyled Text (FOUT) का कारण बनती हैं। इसके अंदर झांककर, आप वेरिफाई कर सकते हैं कि क्या कोई फॉन्ट ठीक से कम्प्रेस किया गया है (WOFF2), यह तय कर सकते हैं कि क्या इसे सबसेट (subset) किया जा सकता है, या यह देख सकते हैं कि क्या इसे पूरी तरह से एक variable font से रिप्लेस किया जा सकता है। इसके अलावा, जब भी आप इंटरनेशनलाइज़ेशन (i18n) में कदम रखते हैं, तो आपको यह पक्का करने के लिए फॉन्ट की glyph टेबल को ऑडिट करना आना चाहिए कि आप जिन भाषाओं को टारगेट कर रहे हैं, वे असल में रेंडर होंगी भी या नहीं।

Fonts के इंटरनल लॉजिक में महारत हासिल करना आपको सिर्फ font-family टाइप करने वाले व्यक्ति से ऊपर उठाकर एक ऐसा व्यक्ति बना देता है जो गहराई से समझता है कि ब्राउज़र स्क्रीन पर सबसे इम्पॉर्टेंट कंटेंट को कैसे पेंट करता है।

और गहराई में जाएं

  • W3C Web Open Font Format (WOFF) 2.0 Specification - वेब के लिए फॉन्ट कम्प्रेशन कैसे काम करता है, उसका ऑफिशियल, टेक्निकल ब्रेकडाउन।
  • Microsoft Typography: OpenType Specification - SFNT टेबल्स, टैग्स और फॉन्ट आर्किटेक्चर पर सबसे बेहतरीन और डिटेल मैनुअल।
  • MDN Web Docs: Variable Fonts - CSS का यूज़ करके variable fonts को इम्प्लीमेंट और स्टाइल करने पर Mozilla की शानदार गाइड।
  • Google Fonts Knowledge: Anatomy of a Typeface - मॉडर्न fonts के टाइपोग्राफिक और टेक्निकल सिद्धांतों पर एक बहुत ही एक्सेसिबल और डीप एजुकेशनल रिसोर्स।

थ्योरी हो गई। अब हाथ आज़माइए — 100% आपके ब्राउज़र में।

टूल आज़माएँ: Font Inspector और Glyph Viewer