पनीकोड

पुनीकोड ​​इंटरनेट होस्ट का नाम  के लिए उपयोग किए जाने वाले सीमित ASCII वर्ण उपसमूह के साथ यूनिकोड का प्रतिनिधित्व है। पुनीकोड ​​का उपयोग करते हुए, यूनिकोड वर्णों वाले होस्ट नामों को अक्षरों, अंकों और हाइफ़न से युक्त ASCII के एक उपसमूह में ट्रांसकोड किया जाता है, जिसे अक्षर-अंक-हाइफ़न (एलडीएच) उपसमुच्चय कहा जाता है। उदाहरण के लिए, मुन्चेन (म्यूनिख के लिए जर्मन भाषा का नाम) को म्न्चेन-3ya के रूप में कोडित किया गया है।

जबकि डोमेन की नामांकन प्रणाली (डीएनएस) तकनीकी रूप से डोमेन नाम लेबल में ऑक्टेट के मनमाने अनुक्रम का समर्थन करता है, डीएनएस मानक पारंपरिक रूप से होस्ट नामों के लिए उपयोग किए जाने वाले एएससीआईआई के एलडीएच उपसमुच्चय के उपयोग की सलाह देते हैं, और आवश्यकता होती है कि डीएनएस डोमेन नामों के बीच स्ट्रिंग तुलना होनी चाहिए- असंवेदनशील. पुनीकोड ​​सिंटैक्स यूनिकोड वर्णों वाले स्ट्रिंग को एनकोड करने की एक विधि है, जैसे कि अंतर्राष्ट्रीयकृत डोमेन नाम (आईडीएनए), डीएनएस द्वारा समर्थित एएससीआईआई के एलडीएच सबसेट में। यह टिप्पणियों के लिए IETF अनुरोध 3492 में निर्दिष्ट है।

एनकोडिंग प्रक्रिया
जैसा कि आरएफसी 3492 में कहा गया है, पुनीकोड ​​बूटस्ट्रिंग नामक एक अधिक सामान्य एल्गोरिदम का एक उदाहरण है, जो 'बुनियादी' कोड बिंदुओं के एक छोटे सेट से बनी स्ट्रिंग्स को बड़े सेट से खींचे गए कोड बिंदुओं की किसी भी स्ट्रिंग को विशिष्ट रूप से प्रस्तुत करने की अनुमति देता है। यूनिकोड टेक्स्ट की विशेषताओं से मेल खाने के लिए पुनीकोड ​​सामान्य बूटस्ट्रिंग एल्गोरिदम के लिए मापदंडों को परिभाषित करता है। यह खंड स्ट्रिंग बुचर (बुचर किताबों के लिए जर्मन भाषा है) के उदाहरण का उपयोग करके पुनीकोड ​​एन्कोडिंग की प्रक्रिया को प्रदर्शित करता है, जिसे लेबल बेचर-केवीए में अनुवादित किया गया है।

ASCII वर्णों का पृथक्करण
सबसे पहले, स्ट्रिंग में सभी ASCII वर्णों को इनपुट से आउटपुट तक कॉपी किया जाता है, किसी भी अन्य वर्ण को छोड़ दिया जाता है। उदाहरण के लिए, bücher को bcher में कॉपी किया गया है। यदि कोई वर्ण कॉपी किया गया था, अर्थात यदि इनपुट में कम से कम एक ASCII वर्ण था, एक ASCII हाइफ़न को आउटपुट में जोड़ा जाता है (उदाहरण के लिए, बुचर → बचर-, लेकिन ü →)।

ध्यान दें कि हाइफ़न स्वयं ASCII वर्ण हैं। इस प्रकार, वे इनपुट में मौजूद हो सकते हैं और यदि हां, तो उन्हें आउटपुट में कॉपी किया जाएगा। इससे कोई अस्पष्टता नहीं होती: यदि आउटपुट में हाइफ़न होता है, तो जो जोड़ा जाता है वह हमेशा अंतिम होता है। यह ASCII वर्णों के अंत का प्रतीक है।

गैर-ASCII वर्णों को एन्कोड करना
इनपुट में प्रत्येक गैर-ASCII वर्ण के लिए, एनकोडर दो संख्याओं की गणना करता है:


 * i इनपुट स्ट्रिंग में गैर-ASCII वर्ण की शून्य-आधारित क्रमांकन | 0-अनुक्रमित स्थिति है (उदाहरण के लिए 0 का अर्थ है कि गैर-ASCII वर्ण इनपुट स्ट्रिंग का पहला वर्ण है)।
 * n, यूनिकोड में, गैर-ASCII वर्ण का संख्यात्मक कोड बिंदु है, शून्य से 127 (ASCII का अंत)।

एनकोडर फिर i*n की गणना करता है, और परिणामी संख्या को आधार-36 अंकों के अनुक्रम में एनकोड करता है। यह उन्हें ASCII में प्रस्तुत करता है, और परिणाम को आउटपुट स्ट्रिंग में जोड़ता है।

ASCII प्रतिपादन है: 0 → 'ए', ..., 25 → 'जेड', 26 → '0', ..., 35 → '9', संख्या के अंकों को endianness|लिटिल-एंडियन क्रम में व्यवस्थित किया गया है।

बेस-36 एन्कोडिंग प्रक्रिया अधिक जटिल है। यह Numeral_system#generalized_variable-length_integers|variable-length पूर्णांक आउटपुट करता है। इनमें यह गुण है कि प्रत्येक संख्या का सबसे महत्वपूर्ण अंक (उदाहरण के लिए संख्या 123 में अंक 1) बिना संदर्भ के पहचाना जा सकता है। इस प्रकार, कई संख्याओं के अंकों को संयोजित किया जा सकता है, उन्हें अलग करने की कोई आवश्यकता नहीं है, फिर भी मूल संख्याओं को पहचाना और निकाला जा सकता है।

अंतर्राष्ट्रीयकृत डोमेन नामों के लिए ACE उपसर्ग
गैर-अंतर्राष्ट्रीय डोमेन नामों में हाइफ़न को पुनीकोड ​​डिकोडिंग को ट्रिगर करने से रोकने के लिए, स्ट्रिंग  अंतर्राष्ट्रीयकृत डोमेन नामों में पुनीकोड ​​अनुक्रमों से जुड़ा हुआ है। इसे ACE (ASCII संगत एन्कोडिंग) कहा जाता है। इस प्रकार डोमेन नाम bücher.tld को ASCII में xn--bcher-kva.tld के रूप में दर्शाया जाएगा।

डिकोडर
डिकोडर एक परिमित-राज्य मशीन है जिसमें दो राज्य चर i और n हैं।

i स्ट्रिंग में एक सूचकांक है, जो शून्य से (शुरुआत में संभावित सम्मिलन का प्रतिनिधित्व करता है) विस्तारित स्ट्रिंग की वर्तमान लंबाई (अंत में संभावित सम्मिलन का प्रतिनिधित्व करता है) तक होता है। मैं शून्य से शुरू करता हूँ.

n 128 (पहला गैर-ASCII कोड बिंदु) से शुरू होता है।

राज्य की प्रगति एक मोनोटोनिक फ़ंक्शन है। एक स्थिति परिवर्तन या तो i को बढ़ाता है या, यदि i अपने अधिकतम पर है, तो i को शून्य पर रीसेट करता है और n को बढ़ाता है। अगले राज्य परिवर्तन पर, हम वेतन वृद्धि फिर से शुरू करते हैं। प्रत्येक अवस्था में, n द्वारा दर्शाया गया कोड बिंदु या तो डाला जाता है या नहीं।

एन्कोडर द्वारा उत्पन्न संख्याएँ दर्शाती हैं कि प्रविष्टि करने से पहले कितनी संभावनाओं को छोड़ा जाना चाहिए।

स्ट्रिंग बैचर में एक अक्षर डालने के लिए छह संभावित स्थान हैं (पहले अक्षर से पहले और आखिरी के बाद सहित)। अंतिम ASCII कोड बिंदु (127 = 0x7F, ASCII का अंत) और ü (कोड बिंदु 252 = 0xFC, यूनिकोड का लैटिन-1_सप्लीमेंट_(यूनिकोड_ब्लॉक)|लैटिन-1 सप्लीमेंट देखें) के बीच 124 कोड बिंदु हैं। ü के लिए एक सम्मिलन स्थिति है जिसे छोड़ दिया जाना चाहिए (स्थिति शून्य: 'बी' से पहले)।

इस प्रकार, डिकोडर आवश्यक सम्मिलन तक पहुंचने से पहले कुल (6 × 124) + 1 = 745 संभावित सम्मिलन को छोड़ देगा। एक बार चरित्र डालने के बाद, अब दूसरा चरित्र डालने के लिए सात संभावित स्थान हैं।

कोड संख्याओं को ASCII अनुक्रमों के रूप में पुनः एन्कोड करना
पुनीकोड ​​इन मानों को दर्शाने के लिए अंक प्रणाली#सामान्यीकृत चर-लंबाई पूर्णांक|सामान्यीकृत चर-लंबाई पूर्णांक का उपयोग करता है। उदाहरण के लिए, कोड संख्या 745 को दर्शाने के लिए kva का उपयोग इस प्रकार किया जाता है:

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

इस मामले में 36 प्रतीकों वाली एक संख्या प्रणाली का उपयोग किया जाता है, केस संवेदनशीलता के साथ | केस-असंवेदनशील 'ए' से 'जेड' दशमलव संख्या 0 से 25 के बराबर है, और '0' से '9' दशमलव संख्या 26 के बराबर है 35 के माध्यम से। इस प्रकार kva, दशमलव संख्या स्ट्रिंग 10 21 0 से मेल खाता है। 

प्रतीकों की इस स्ट्रिंग को डिकोड करने के लिए, थ्रेसहोल्ड के अनुक्रम की आवश्यकता होगी, इस मामले में यह (1, 1, 26, 26, ...) है। सबसे कम महत्वपूर्ण अंक का वजन (या स्थानीय मान) हमेशा 1 होता है: 'k' (=10) 1 के वजन के साथ 10 के बराबर होता है। इसके बाद, अगले अंक का वजन पहली सीमा पर निर्भर करता है: आम तौर पर, के लिए कोई भी n, (n+1)-वें अंक का वजन पिछले एक बार के वजन के बराबर होता है (36 - n-वें अंक की सीमा)। तो दूसरे प्रतीक का स्थानीय मान 36 है, जिसमें पिछली सीमा का मान घटा दिया गया है, इस मामले में, 35। इसलिए, पहले दो प्रतीकों 'k' (=10) और 'v' (=21) का योग 10 × 1 है। + 21 × 35। चूंकि दूसरा प्रतीक 1 के सीमा मान से कम नहीं है, इसलिए अभी और भी बहुत कुछ आना बाकी है। हालाँकि, चूँकि इस उदाहरण में तीसरा प्रतीक 'a' (=0) है, इसलिए हम इसके वजन की गणना को अनदेखा कर सकते हैं। इसलिए, kva दशमलव संख्या (10 × 1) + (21 × 35) = 745 का प्रतिनिधित्व करता है। प्रत्येक क्रमिक एन्कोडेड वर्ण के लिए थ्रेशोल्ड स्वयं एक एल्गोरिदम द्वारा निर्धारित किए जाते हैं, जिसमें उन्हें 1 और 26 के बीच शामिल किया जाता है। फिर केस का उपयोग स्ट्रिंग के मूल केस के बारे में जानकारी प्रदान करने के लिए किया जा सकता है। चूँकि विशेष वर्णों को एन्कोडिंग एल्गोरिदम द्वारा उनके कोड बिंदुओं के आधार पर क्रमबद्ध किया जाता है, बुचर में दूसरे विशेष वर्ण को सम्मिलित करने के लिए, पहली संभावना कोड bcher-kvaa के साथ büücher है, कोड bcher-kvab के साथ दूसरी büucher है, आदि। कोड के साथ bücherü के बाद bcher-kvae में ý के सम्मिलन का प्रतिनिधित्व करने वाले कोड आते हैं, ü के बाद यूनिकोड वर्ण, ýbücher से शुरू होकर कोड bcher-kvaf (übücher कोडित bcher-jvab से भिन्न), आदि।

एन्कोडिंग और डिकोडिंग एल्गोरिदम को सरल बनाने के लिए, कुछ एन्कोडेड मानों को अस्वीकार्य यूनिकोड मानों को एन्कोड करने से रोकने का कोई प्रयास नहीं किया गया है: हालाँकि, डिकोडिंग के दौरान इनकी जाँच की जानी चाहिए और इनका पता लगाया जाना चाहिए।

पुनीकोड ​​को सभी स्क्रिप्ट्स पर काम करने के लिए डिज़ाइन किया गया है, और इसे संचालित करते समय स्ट्रिंग के भीतर वर्ण सेट श्रेणियों को अनुकूलित करने का प्रयास करके स्व-अनुकूलन किया जाता है। यह उस मामले के लिए अनुकूलित है जहां स्ट्रिंग शून्य या अधिक ASCII वर्णों से बनी है और इसके अतिरिक्त केवल एक अन्य स्क्रिप्ट सिस्टम के वर्ण हैं, लेकिन किसी भी मनमानी यूनिकोड स्ट्रिंग के साथ सामना करेंगे। ध्यान दें कि DNS उपयोग के लिए, डोमेन नाम स्ट्रिंग को नाम-तैयारी  का उपयोग करके सामान्यीकृत किया गया है और (शीर्ष-स्तरीय डोमेन के लिए) पुनीकोड ​​किए जाने से पहले आधिकारिक तौर पर पंजीकृत भाषा तालिका के विरुद्ध फ़िल्टर किया गया है, और DNS प्रोटोकॉल स्वीकार्य लंबाई पर सीमा निर्धारित करता है। आउटपुट पुनीकोड ​​स्ट्रिंग।

उदाहरण
निम्न तालिका विभिन्न प्रकार के इनपुट के लिए पुनीकोड ​​एन्कोडिंग के उदाहरण दिखाती है।

यह भी देखें

 * इमोजी डोमेन
 * यूटीएफ-5
 * यूटीएफ-6
 * वेबसाइट स्पूफ़िंग

बाहरी संबंध

 * IETF Punycode standard
 * ICU IDNA Demonstration An online demonstration of how ICU performs IDN operations
 * List of TLDs considered by the Mozilla developers to have an effective anti-spoofing policy for name registration
 * IDN and Punycode in IE7
 * Simple Punycode converter