एचटीएमएल में अक्षर एनकोडिंग

जबकि हाइपरटेक्स्ट मार्कअप लैंग्वेज (एचटीएमएल) 1991 से उपयोग में है, दिसंबर 1997 से एचटीएमएल 4.0 पहला मानकीकृत संस्करण था जहां अंतर्राष्ट्रीय चरित्र (कंप्यूटिंग) को यथोचित पूर्ण उपचार दिया गया था। जब एक HTML दस्तावेज़ में सात-बिट ASCII की सीमा के बाहर विशेष वर्ण शामिल होते हैं, तो दो लक्ष्य विचार करने योग्य होते हैं: सूचना की अखंडता, और सार्वभौमिक वेब ब्राउज़र प्रदर्शन।

दस्तावेज़ के वर्ण एन्कोडिंग निर्दिष्ट करना
दस्तावेज़ में कौन से वर्ण एन्कोडिंग का उपयोग किया जाता है, यह निर्दिष्ट करने के दो सामान्य तरीके हैं।

सबसे पहले, वेब सर्वर में वर्ण एन्कोडिंग या शामिल हो सकता है हाइपरटेक्स्ट परहस्त शिष्टाचार  (HTTP) में   हेडर, जो आमतौर पर इस तरह दिखेगा: सामग्री-प्रकार: पाठ/एचटीएमएल; वर्णसेट = यूटीएफ -8 यह विधि HTTP सर्वर को सामग्री बातचीत के अनुसार दस्तावेज़ के एन्कोडिंग को बदलने का एक सुविधाजनक तरीका देती है; कुछ HTTP सर्वर सॉफ़्टवेयर इसे कर सकते हैं, उदाहरण के लिए Apache, Apache मॉड्यूल की सूची के साथ. दूसरा, एक घोषणा को दस्तावेज़ में ही शामिल किया जा सकता है।

HTML के लिए इस जानकारी को अंदर शामिल करना संभव है  दस्तावेज़ के शीर्ष के निकट तत्व:

<वाक्यविन्यास लैंग = html4सख्त> <मेटा http-equiv= सामग्री-प्रकार सामग्री= टेक्स्ट/एचटीएमएल; चारसेट=यूटीएफ-8 > 

HTML5 निम्नलिखित सिंटैक्स को बिल्कुल समान अर्थ देने की अनुमति देता है:

<वाक्यविन्यास लैंग = html4सख्त> <मेटा वर्णसेट = यूटीएफ -8> 

एक्सएचटीएमएल दस्तावेज़ों में एक तीसरा विकल्प है: एक्सएमएल घोषणा के माध्यम से वर्ण एन्कोडिंग व्यक्त करने के लिए, इस प्रकार है: इस दूसरे दृष्टिकोण के साथ, क्योंकि वर्ण एन्कोडिंग को तब तक नहीं जाना जा सकता जब तक कि घोषणा को पार्स नहीं किया जाता है, यह जानने में समस्या होती है कि दस्तावेज़ में कौन से वर्ण एन्कोडिंग का उपयोग घोषणा तक और स्वयं घोषणा सहित किया जाता है। यदि वर्ण एन्कोडिंग एक ASCII एक्सटेंशन है तो घोषणा तक और घोषणा सहित सामग्री शुद्ध ASCII होनी चाहिए और यह सही तरीके से काम करेगी। कैरेक्टर एनकोडिंग के लिए जो ASCII एक्सटेंशन नहीं हैं (अर्थात ASCII का सुपरसेट नहीं), जैसे कि UTF-16BE और UTF-16LE, HTML का एक प्रोसेसर, जैसे वेब ब्राउज़र, कुछ मामलों में घोषणा को पार्स करने में सक्षम होना चाहिए ह्यूरिस्टिक्स का उपयोग।

एन्कोडिंग पहचान एल्गोरिदम
HTML5 के अनुसार अनुशंसित चारसेट UTF-8 है। एक एन्कोडिंग स्नीफिंग एल्गोरिदम को इनपुट के कई स्रोतों के आधार पर दस्तावेज़ के वर्ण एन्कोडिंग को निर्धारित करने के लिए विनिर्देश में परिभाषित किया गया है:
 * 1) स्पष्ट उपयोगकर्ता निर्देश
 * 2) दस्तावेज़ के पहले 1024 बाइट्स के भीतर एक स्पष्ट मेटा टैग
 * 3) दस्तावेज़ के पहले तीन बाइट्स के भीतर एक बाइट ऑर्डर मार्क (BOM)।
 * 4) HTTP सामग्री-प्रकार या अन्य परिवहन परत की जानकारी
 * 5) विशिष्ट अनुक्रमों या बाइट मानों की श्रेणियों की तलाश में दस्तावेज़ बाइट्स का विश्लेषण, और अन्य अस्थायी पहचान तंत्र।

प्रिंट करने योग्य ASCII रेंज (32 से 126) के बाहर वर्ण आमतौर पर गलत तरीके से दिखाई देते हैं। यह अंग्रेजी भाषा बोलने वाले उपयोगकर्ताओं के लिए कुछ समस्याएं प्रस्तुत करता है, लेकिन अन्य भाषाओं को नियमित रूप से—कुछ मामलों में, हमेशा—उस सीमा के बाहर वर्णों की आवश्यकता होती है। चीनी, जापानी, और कोरियाई (सीजेके) भाषा वातावरण में जहां उपयोग में कई अलग-अलग मल्टी-बाइट एनकोडिंग हैं, ऑटो-डिटेक्शन भी अक्सर नियोजित होता है। अंत में, ब्राउज़र आमतौर पर उपयोगकर्ता को मैन्युअल रूप से भी गलत चारसेट लेबल को ओवरराइड करने की अनुमति देते हैं।

गैर-पश्चिमी भाषाओं में बहुभाषी वेबसाइटों और वेबसाइटों के लिए UTF-8 का उपयोग करना तेजी से सामान्य होता जा रहा है, जो सभी भाषाओं के लिए समान एन्कोडिंग के उपयोग की अनुमति देता है। UTF-16 या UTF-32, जिनका उपयोग सभी भाषाओं के लिए भी किया जा सकता है, कम व्यापक रूप से उपयोग किए जाते हैं क्योंकि वे प्रोग्रामिंग भाषाओं में संभालना कठिन हो सकते हैं जो बाइट-उन्मुख ASCII सुपरसेट एन्कोडिंग मानते हैं, और वे टेक्स्ट के साथ कम कुशल हैं ASCII वर्णों की एक उच्च आवृत्ति, जो आमतौर पर HTML दस्तावेज़ों के मामले में होती है।

किसी पृष्ठ को सफलतापूर्वक देखना अनिवार्य रूप से इस बात का संकेत नहीं है कि उसका एन्कोडिंग सही तरीके से निर्दिष्ट किया गया है। यदि पृष्ठ के निर्माता और पाठक दोनों कुछ प्लेटफ़ॉर्म-विशिष्ट वर्ण एन्कोडिंग मान रहे हैं, और सर्वर कोई पहचान करने वाली जानकारी नहीं भेजता है, तो पाठक फिर भी पृष्ठ को निर्माता के रूप में देखेगा, लेकिन अन्य पाठकों को विभिन्न प्लेटफार्मों पर या अलग-अलग मूल भाषाओं के साथ पृष्ठ को इच्छित के रूप में नहीं देखेगा।

अनुमत एन्कोडिंग
WHATWG एन्कोडिंग मानक, हाल के HTML मानकों (वर्तमान WHATWG HTML लिविंग स्टैंडर्ड, साथ ही पूर्व प्रतिस्पर्धी W3C HTML 5.0 और 5.1) द्वारा संदर्भित एन्कोडिंग की एक सूची निर्दिष्ट करता है जिसे ब्राउज़र को समर्थन करना चाहिए। HTML मानक अन्य एनकोडिंग के समर्थन की मनाही करते हैं।  एन्कोडिंग मानक आगे यह निर्धारित करता है कि नए प्रारूप, नए प्रोटोकॉल (मौजूदा प्रारूपों का उपयोग किए जाने पर भी) और नए दस्तावेज़ों के लेखकों को यूटीएफ -8 का विशेष रूप से उपयोग करने की आवश्यकता है।

UTF-8 के अलावा, एन्कोडिंग मानक के संदर्भ में निम्नलिखित एन्कोडिंग स्पष्ट रूप से HTML मानक में ही सूचीबद्ध हैं: • ISO-8859-2

• ISO-8859-7

• ISO-8859-8

• Windows-874

• Windows-1250

• Windows-1251

• Windows-1252

• Windows-1254

• Windows-1255

• Windows-1256

• Windows-1257

• Windows-1258

• GB 18030

• Big5

• Shift JIS

• ISO-2022-JP

• EUC-KR

• UTF-16BE

• UTF-16LE

• x-user-defined

निम्नलिखित अतिरिक्त एनकोडिंग एनकोडिंग मानक में सूचीबद्ध हैं, और इसलिए उनके लिए समर्थन भी आवश्यक है: • Code page 866

• ISO-8859-3

• ISO-8859-4

• ISO-8859-5

• ISO-8859-6

• ISO-8859-8-

• ISO-8859-10

• ISO-8859-13

• ISO-8859-14

• ISO-8859-15

• ISO-8859-16

• KOI8-R

• KOI8-U / KOI8-RU

• Mac OS Roman

• Windows-1253

• Mac OS Cyrillic

• GBK

• EUC-JP

निम्नलिखित एनकोडिंग वर्जित एनकोडिंग के स्पष्ट उदाहरण के रूप में सूचीबद्ध हैं: • CESU-8

• UTF-7

• BOCU-1

• SCSU

• EBCDIC

• UTF-32

मानक एक प्रतिस्थापन डिकोडर को भी परिभाषित करता है, जो प्रतिस्थापन चरित्र (�) के लिए निश्चित एन्कोडिंग के रूप में लेबल की गई सभी सामग्री को मैप करता है, इसे संसाधित करने से इनकार करता है। इसका उद्देश्य उन हमलों (जैसे क्रॉस साइट स्क्रिप्टिंग) को रोकना है जो क्लाइंट और सर्वर के बीच अंतर का फायदा उठा सकते हैं कि कौन से एन्कोडिंग दुर्भावनापूर्ण सामग्री को छिपाने के लिए समर्थित हैं। यद्यपि समान सुरक्षा चिंता ISO-2022-JP और UTF-16 पर लागू होती है, जो ASCII बाइट्स के अनुक्रमों को अलग तरह से व्याख्या करने की अनुमति देती है, इस दृष्टिकोण को उनके लिए संभव नहीं देखा गया क्योंकि वे तुलनात्मक रूप से तैनात सामग्री में अधिक बार उपयोग किए जाते हैं। निम्नलिखित एनकोडिंग इस उपचार को प्राप्त करते हैं: • ISO-2022-KR

• ISO-2022-CN

• ISO-2022-CN-EXT

• HZ-GB-2312

चरित्र संदर्भ
मूल वर्ण एन्कोडिंग के अलावा, वर्णों को वर्ण संदर्भों के रूप में भी एन्कोड किया जा सकता है, जो संख्यात्मक वर्ण संदर्भ (दशमलव या हेक्साडेसिमल) या वर्ण इकाई संदर्भ हो सकते हैं। चरित्र इकाई संदर्भों को कभी-कभी नामित संस्थाओं या HTML के लिए HTML संस्थाओं के रूप में भी संदर्भित किया जाता है। HTML के चरित्र संदर्भों का उपयोग SGML से निकला है।

HTML वर्ण संदर्भ
एचटीएमएल में एक संख्यात्मक चरित्र संदर्भ एक चरित्र को उसके यूनिवर्सल कैरेक्टर सेट/यूनिकोड कोड बिंदु से संदर्भित करता है, और प्रारूप का उपयोग करता है



या

जहाँ nnnn दशमलव रूप में कोड बिंदु है, और hhhh हेक्साडेसिमल रूप में कोड बिंदु है। एक्स एक्सएमएल दस्तावेजों में लोअरकेस होना चाहिए। एनएनएनएन या एचएचएचएच अंकों की संख्या हो सकती है और इसमें अग्रणी शून्य शामिल हो सकते हैं। hhhh अपरकेस और लोअरकेस को मिला सकता है, हालांकि अपरकेस सामान्य शैली है।

HTML दस्तावेज़ों के प्राप्तकर्ता द्वारा उपयोग किए जाने वाले सभी वेब ब्राउज़र या ईमेल क्लाइंट, या HTML दस्तावेज़ों के लेखकों द्वारा उपयोग किए जाने वाले पाठ संपादक, सभी HTML वर्णों को प्रस्तुत करने में सक्षम नहीं होंगे। अधिकांश आधुनिक सॉफ़्टवेयर उपयोगकर्ता की भाषा के लिए अधिकांश या सभी वर्णों को प्रदर्शित करने में सक्षम होते हैं, और उन वर्णों के लिए एक बॉक्स या अन्य स्पष्ट संकेतक बनाते हैं जिन्हें वे प्रस्तुत नहीं कर सकते।

0 से 127 तक के कोड के लिए, मूल 7-बिट ASCII मानक सेट, इनमें से अधिकांश वर्णों का उपयोग वर्ण संदर्भ के बिना किया जा सकता है। 160 से 255 तक के सभी कोड XML और HTML वर्ण इकाई संदर्भों की सूची का उपयोग करके बनाए जा सकते हैं। इकाई नामों का उपयोग करके केवल कुछ उच्च संख्या वाले कोड बनाए जा सकते हैं, लेकिन सभी को दशमलव संख्या वर्ण संदर्भ द्वारा बनाया जा सकता है।

चरित्र इकाई संदर्भों का प्रारूप भी हो सकता है  जहाँ नाम एक केस-संवेदी अल्फ़ान्यूमेरिक स्ट्रिंग है। उदाहरण के लिए, λ को भी एन्कोड किया जा सकता है   एक HTML दस्तावेज़ में। चरित्र इकाई संदर्भ ,  ,   और   HTML और SGML में पूर्वनिर्धारित होते हैं, क्योंकि  ,  ,   और   मार्कअप को परिसीमित करने के लिए पहले से ही उपयोग किया जाता है। इसमें विशेष रूप से एक्सएमएल शामिल नहीं था   (') HTML5 से पहले की इकाई। सभी नामित HTML वर्ण इकाई संदर्भों की सूची के साथ-साथ उन संस्करणों के लिए जिनमें वे पेश किए गए थे, XML और HTML वर्ण इकाई संदर्भों की सूची देखें।

HTML वर्ण संदर्भों का अनावश्यक उपयोग HTML पठनीयता को महत्वपूर्ण रूप से कम कर सकता है। यदि किसी वेब पेज के लिए वर्ण एन्कोडिंग उचित रूप से चुना गया है, तो HTML वर्ण संदर्भ आमतौर पर केवल ऊपर बताए गए मार्कअप परिसीमन वर्णों के लिए आवश्यक होते हैं, और कुछ विशेष वर्णों के लिए (या बिल्कुल नहीं, यदि मूल यूनिकोड एन्कोडिंग जैसे UTF-8 का उपयोग किया जाता है) ). गलत HTML इकाई से बचने से क्रॉस साइट स्क्रिप्टिंग  जैसे इंजेक्शन हमलों के लिए सुरक्षा भेद्यताएं भी खुल सकती हैं। यदि HTML एट्रिब्यूट्स को बिना कोट किए छोड़ दिया जाता है, तो कुछ कैरेक्टर्स, सबसे महत्वपूर्ण  व्हाइटस्पेस चरित्र, जैसे कि स्पेस और टैब, को एंटिटीज का उपयोग करके बचाना चाहिए। HTML से संबंधित अन्य भाषाओं में पात्रों से बचने के अपने तरीके हैं।

एक्सएमएल चरित्र संदर्भ
वर्ण इकाई संदर्भों की अपनी बड़ी श्रृंखला के साथ पारंपरिक HTML के विपरीत, XML में केवल पाँच पूर्वनिर्धारित वर्ण इकाई संदर्भ हैं। इनका उपयोग उन वर्णों से बचने के लिए किया जाता है जो कुछ संदर्भों में मार्कअप संवेदनशील होते हैं:
 * → और (एम्परसेंड, यू+0026)
 * → < (इससे कम चिह्न, U+003C)
 * → > (ग्रेटर दैन साइन, U+003E)
 * → (उद्धरण चिह्न, U+0022)
 * → ' (एपोस्ट्रोफी, यू+0027)

अन्य सभी वर्ण इकाई संदर्भों को उपयोग किए जाने से पहले परिभाषित किया जाना चाहिए। उदाहरण के लिए, का उपयोग  (जो é देता है, लैटिन लोअर-केस E एक्यूट एक्सेंट के साथ, यूनिकोड में U+00E9) एक XML दस्तावेज़ में एक त्रुटि उत्पन्न करेगा जब तक कि इकाई पहले से ही परिभाषित नहीं की गई हो। XML के लिए यह भी आवश्यक है कि   हेक्साडेसिमल में संख्यात्मक संदर्भ लोअरकेस में हों: उदाहरण के लिए   इसके बजाय. XHTML, जो एक XML अनुप्रयोग है, XML की पूर्वनिर्धारित संस्थाओं के साथ HTML इकाई सेट का समर्थन करता है।

यह भी देखें

 * चारसेट सूँघना - कई ब्राउज़रों द्वारा उपयोग किया जाता है जब वर्ण एन्कोडिंग मेटाडेटा उपलब्ध नहीं होता है
 * यूनिकोड और एचटीएमएल
 * भाषा कोड
 * एक्सएमएल और एचटीएमएल चरित्र इकाई संदर्भों की सूची

बाहरी संबंध

 * Online HTML entity encoder & decoder tool
 * Character entity references in HTML4
 * The Definitive Guide to Web Character Encoding
 * HTML Entity Encoding chapter of Browser Security Handbook – more information about current browsers and their entity handling
 * The Open Web Application Security Project's wiki article on cross-site scripting (XSS)