lang, dir और एन्कोडिंग घोषणा का समझदारी से उपयोग करें, और Unicode नॉर्मलाइज़ेशन तथा दिशात्मकता के जालों को हराएँ।
इस पाठ को Kodokon में खोलेंlang एट्रिब्यूट मेटाडेटा से कहीं अधिक है: यह स्क्रीन रीडर की आवाज़ों को, हाइफ़नेशन को (hyphens: auto इसके बिना काम नहीं करता), CJK ग्लिफ़ के चयन को (एक ही विचारचित्र जापानी और चीनी में अलग तरह से बनाया जाता है), <q> द्वारा उत्पन्न उद्धरण चिह्नों को और CSS :lang() सेलेक्टर को चलाता है। यह विरासत में मिलता है: इसे <html> पर एक BCP 47 टैग (en, en-GB, ja) के साथ घोषित करें और हर भाषा परिवर्तन पर इसे स्थानीय रूप से ओवरराइड करें।
<html lang="en">
<p>She said: <q>hello</q>.</p>
<p lang="fr">Elle a dit : <q>bonjour</q>.</p>
</html>dir=rtl डिफ़ॉल्ट संरेखण और तटस्थ दिशात्मकता वाले वर्णों के दृश्य क्रम को पलट देता है। अप्रत्याशित उपयोगकर्ता सामग्री के लिए, dir=auto पहले प्रबल दिशात्मक वर्ण के आधार पर दिशा चुनता है। <bdi> तत्व एक फ़्रैगमेंट को द्विदिशात्मक एल्गोरिथ्म से अलग कर देता है: इसके बिना, एक अरबी उपयोगकर्ता नाम जिसके बाद ": 12 points" आता है, अपने विराम चिह्नों को बेतरतीब ढंग से पुनर्व्यवस्थित होते हुए देखता है।
<p dir="auto">مرحبا - inferred direction: RTL</p>
<ul>
<li><bdi>مستخدم</bdi>: 12 points</li>
<li><bdi>Alice</bdi>: 8 points</li>
</ul><meta charset=utf-8> घोषणा दस्तावेज़ के पहले 1024 बाइट्स के भीतर प्रकट होनी चाहिए: ब्राउज़र एन्कोडिंग चुनने से पहले उस विंडो तक सीमित एक प्रीस्कैन चलाता है। किसी घोषणा और किसी HTTP हेडर के बिना, डिफ़ॉल्ट एन्कोडिंग उपयोगकर्ता के लोकेल पर निर्भर करती है (पश्चिमी यूरोप में अक्सर windows-1252) - कभी UTF-8 नहीं। हालाँकि फ़ाइल की शुरुआत में एक BOM बाकी सब कुछ ओवरराइड कर देता है, यहाँ तक कि HTTP हेडर को भी।
const composed = "\u00e9";
const decomposed = "e\u0301";
console.log(composed === decomposed); // false
const nfc = decomposed.normalize("NFC");
console.log(composed === nfc); // truemacOS कुछ फ़ाइल नामों को विघटित रूप (NFD) में संग्रहीत करता है: इसलिए किसी अपलोड से आने वाला "é" कीबोर्ड पर टाइप किए गए से भिन्न हो सकता है। सभी उपयोगकर्ता इनपुट को संग्रहीत या तुलना करने से पहले व्यवस्थित रूप से NFC में नॉर्मलाइज़ करें। अंत में, .length UTF-16 कोड यूनिट गिनता है, न कि अनुभूत वर्ण: एक परिवार इमोजी इनमें से सात से अधिक को जोड़ता है; वास्तविक ग्राफ़ीम गिनने के लिए Intl.Segmenter का उपयोग करें।
<meta charset=utf-8> घोषणा अनिवार्य रूप से कहाँ स्थित होनी चाहिए?<head> में कहीं भी<body> के पहले 512 बाइट्स के भीतरdir=auto किसी तत्व की दिशा कैसे निर्धारित करता है?<html> तत्व पर घोषित दिशा लागू करता है=== के लिए भिन्न क्यों हो सकती हैं?