Kodokon kodokon.com

अंतर्राष्ट्रीयकरण: lang, dir, charset और Unicode के जाल

lang, dir और एन्कोडिंग घोषणा का समझदारी से उपयोग करें, और Unicode नॉर्मलाइज़ेशन तथा दिशात्मकता के जालों को हराएँ।

9 मिनट · 3 प्रश्न

इस पाठ को Kodokon में खोलें

lang एट्रिब्यूट मेटाडेटा से कहीं अधिक है: यह स्क्रीन रीडर की आवाज़ों को, हाइफ़नेशन को (hyphens: auto इसके बिना काम नहीं करता), CJK ग्लिफ़ के चयन को (एक ही विचारचित्र जापानी और चीनी में अलग तरह से बनाया जाता है), <q> द्वारा उत्पन्न उद्धरण चिह्नों को और CSS :lang() सेलेक्टर को चलाता है। यह विरासत में मिलता है: इसे <html> पर एक BCP 47 टैग (en, en-GB, ja) के साथ घोषित करें और हर भाषा परिवर्तन पर इसे स्थानीय रूप से ओवरराइड करें।

HTML
<html lang="en">
  <p>She said: <q>hello</q>.</p>
  <p lang="fr">Elle a dit : <q>bonjour</q>.</p>
</html>
q के उद्धरण चिह्न भाषा का अनुसरण करते हैं: “hello” फिर « bonjour »।

dir=rtl डिफ़ॉल्ट संरेखण और तटस्थ दिशात्मकता वाले वर्णों के दृश्य क्रम को पलट देता है। अप्रत्याशित उपयोगकर्ता सामग्री के लिए, dir=auto पहले प्रबल दिशात्मक वर्ण के आधार पर दिशा चुनता है। <bdi> तत्व एक फ़्रैगमेंट को द्विदिशात्मक एल्गोरिथ्म से अलग कर देता है: इसके बिना, एक अरबी उपयोगकर्ता नाम जिसके बाद ": 12 points" आता है, अपने विराम चिह्नों को बेतरतीब ढंग से पुनर्व्यवस्थित होते हुए देखता है।

HTML
<p dir="auto">مرحبا - inferred direction: RTL</p>
<ul>
  <li><bdi>مستخدم</bdi>: 12 points</li>
  <li><bdi>Alice</bdi>: 8 points</li>
</ul>
bdi लेआउट को द्विदिशात्मक उपयोगकर्ता नामों से बचाता है।

<meta charset=utf-8> घोषणा दस्तावेज़ के पहले 1024 बाइट्स के भीतर प्रकट होनी चाहिए: ब्राउज़र एन्कोडिंग चुनने से पहले उस विंडो तक सीमित एक प्रीस्कैन चलाता है। किसी घोषणा और किसी HTTP हेडर के बिना, डिफ़ॉल्ट एन्कोडिंग उपयोगकर्ता के लोकेल पर निर्भर करती है (पश्चिमी यूरोप में अक्सर windows-1252) - कभी UTF-8 नहीं। हालाँकि फ़ाइल की शुरुआत में एक BOM बाकी सब कुछ ओवरराइड कर देता है, यहाँ तक कि HTTP हेडर को भी।

JAVASCRIPT
const composed = "\u00e9";
const decomposed = "e\u0301";
console.log(composed === decomposed); // false
const nfc = decomposed.normalize("NFC");
console.log(composed === nfc);        // true
दो दृश्यतः समान “é”, फिर भी स्मृति में भिन्न।

macOS कुछ फ़ाइल नामों को विघटित रूप (NFD) में संग्रहीत करता है: इसलिए किसी अपलोड से आने वाला "é" कीबोर्ड पर टाइप किए गए से भिन्न हो सकता है। सभी उपयोगकर्ता इनपुट को संग्रहीत या तुलना करने से पहले व्यवस्थित रूप से NFC में नॉर्मलाइज़ करें। अंत में, .length UTF-16 कोड यूनिट गिनता है, न कि अनुभूत वर्ण: एक परिवार इमोजी इनमें से सात से अधिक को जोड़ता है; वास्तविक ग्राफ़ीम गिनने के लिए Intl.Segmenter का उपयोग करें।

ज्ञान जांच

सुनिश्चित करें कि आपको इस पाठ के मुख्य बिंदु याद हैं।

  1. <meta charset=utf-8> घोषणा अनिवार्य रूप से कहाँ स्थित होनी चाहिए?
    • <head> में कहीं भी
    • दस्तावेज़ के पहले 1024 बाइट्स के भीतर
    • DOCTYPE घोषणा से पहले
    • <body> के पहले 512 बाइट्स के भीतर
  2. dir=auto किसी तत्व की दिशा कैसे निर्धारित करता है?
    • यह सामग्री के पहले प्रबल दिशात्मक वर्ण की जाँच करता है
    • यह <html> तत्व पर घोषित दिशा लागू करता है
    • यह RTL और LTR वर्णों को गिनता है और बहुमत को रखता है
  3. दो स्ट्रिंग जो दोनों “é” प्रदर्शित करती हैं, === के लिए भिन्न क्यों हो सकती हैं?
    • क्योंकि एक UTF-8 में एन्कोडेड है और दूसरी UTF-16 में
    • क्योंकि Unicode केसिंग लोकेल के अनुसार भिन्न होती है
    • क्योंकि एक पूर्वसंयोजित वर्ण U+00E9 का उपयोग करती है और दूसरी विघटित अनुक्रम e + U+0301 का