पनीकोड

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

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

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

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

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

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


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

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

एएससीआईआई प्रतिपादन 0 → 'a', ..., 25 → 'z', 26 → '0', ..., 35 → '9', संख्या के अंकों को छोटे-छोटे क्रम में व्यवस्थित किया जाता है।

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

अंतर्राष्ट्रीयकृत डोमेन नामों के लिए एसीइ प्रीफ़िक्स
गैर-अंतर्राष्ट्रीय डोमेन नामों में हाइफ़न को पुनीकोड ​​डिकोडिंग को ट्रिगर करने से रोकने के लिए, स्ट्रिंग  अंतर्राष्ट्रीयकृत डोमेन नामों में पुनीकोड ​​अनुक्रमों से संयोजित किया जाता है। इसे एसीइ (एएससीआईआई संगत एन्कोडिंग) कहा जाता है।

इस प्रकार डोमेन नाम बुचर डॉट टीएलडी को एएससीआईआई में xn--bcher-kva.tld के रूप में दर्शाया जाता है।

डिकोडर
डिकोडर एक फाईनाइट स्टेट मशीन के रूप में है, जिसमें दो स्टेट चर i और n होते है।

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

n 128 से शुरू होता है और इस प्रकार पहला गैर-एएससीआईआई कोड बिंदु के रूप में होता है।

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

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

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

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

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

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

इस स्थिति में 36 प्रतीकों वाली एक संख्या प्रणाली का उपयोग किया जाता है और इस प्रकार केस संवेदनशीलता के साथ 'a' से 'z' दशमलव संख्या 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 से भिन्न), आदि।

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

पुनीकोड ​​को सभी स्क्रिप्ट्स पर काम करने के लिए डिज़ाइन किया गया है, और इसे संचालित करते समय स्ट्रिंग के भीतर वर्ण समूह श्रेणियों को अनुकूलित करने का प्रयास करके स्व-अनुकूलन किया जाता है। यह उस स्थिति  के लिए अनुकूलित है जहां स्ट्रिंग शून्य या अधिक एएससीआईआई वर्णों से बनी है और इसके अतिरिक्त केवल एक अन्य स्क्रिप्ट सिस्टम के वर्ण हैं, लेकिन किसी भी मनमानी यूनिकोड स्ट्रिंग के साथ सामना करेंगे। ध्यान दें कि 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