लक्ष्य आधिकारिक यूनिकोड एन्कोडिंग के बीच पूरी तरह से अनुरूप कनवर्टर बनाने के लिए है जैसा कि UTF FAQ में दिया गया है । यह देखते हुए कि यह यूनिकोड पर केंद्रित है, मैं इसमें शामिल एन्कोडिंग्स (जो शायद UTF-8 होगा, जब तक कि आप इसे एपीएल में प्रोग्राम नहीं करते) का उपयोग करके सबसे कम बाइट गिनती के साथ उत्तर स्वीकार करेंगे। मैं लंबी पोस्ट के लिए माफी मांगता हूं, लेकिन इसमें से बहुत सारे एनकोडिंग की व्याख्या कर रहे हैं जो आधिकारिक विनिर्देश (पीडीएफ, अनुभाग 3.9 डी 90 - डी 92) या विकिपीडिया में भी एक्सेस किए जा सकते हैं ।
विशेष विवरण
अगर किसी भी समय आपकी पसंद की भाषा किसी आवश्यकता को पूरा नहीं कर सकती है, तो उसे किसी ऐसी चीज से प्रतिस्थापित करें जो दिए गए नियमों की भावना को चुरा लेती है। उदाहरण के लिए। हर भाषा में अंतर्निहित सरणियाँ, कार्य आदि नहीं होते हैं।
स्ट्रिंग लाइब्रेरी / फ़ंक्शंस, या लाइब्रेरीज़ / फ़ंक्शंस का उपयोग न करना। इस कोड गोल्फ का बिंदु बिट / बाइट हेरफेर का उपयोग करके कनवर्टर को लागू करना है। हालांकि एक चरित्र या बाइट सरणी के रूप में अपनी क्षमता में स्ट्रिंग्स का उपयोग करने की अनुमति है। ओह, और कोई OS कॉल नहीं है जो या तो रूपांतरण करते हैं।
कनवर्टर एक फ़ंक्शन है जो तीन मापदंडों को ले जाएगा: एक बाइट सरणी एन्कोडेड इनपुट स्ट्रिंग का प्रतिनिधित्व करता है, और "इनपुट" और "आउटपुट" एन्कोडिंग को संख्याओं के रूप में दर्शाया गया है।
UTF-8, UTF-16, UTF-16BE, UTF-16LE, UTF-32, UTF-32BE, and UTF32LE
उस क्रम में हम 0 से 6 तक संख्या निर्दिष्ट करेंगे । यह जाँचने की कोई आवश्यकता नहीं है कि संख्या क्या है< 0
या> 6
, हम मान लेंगे कि ये पैरामीटर सही हैं। कनवर्टर वांछित आउटपुट एन्कोडिंग में एक मान्य बाइट सरणी लौटाएगा।हम
U+0000
एक स्ट्रिंग टर्मिनेटर के रूप में अशक्त चरित्र ( ) का उपयोग करेंगे। इसके बाद कुछ भी मायने नहीं रखता। हम मानेंगे कि इनपुट ऐरे में अशक्त वर्ण कहीं है, इसलिए आपको सीमा जाँच करने की आवश्यकता नहीं है।एफएक्यू के अनुसार , यदि इनपुट बाइट सरणी इसकी घोषित एन्कोडिंग के लिए अमान्य है, तो हमें एक त्रुटि का संकेत देना चाहिए। हम इसे निम्न तरीकों में से एक में करेंगे: प्रोग्राम को क्रैश करें, एक अपवाद फेंकें, अशक्त लौटें या एक सरणी वापस करें जिनके पहले चार बाइट्स सभी 0 हैं (ताकि इसे
U+0000
हर एन्कोडिंग के रूप में पहचाना जा सके )।
एनकोडिंग
आधिकारिक विनिर्देशों का पालन किया जाना चाहिए, लेकिन विकिपीडिया एन्कोडिंग के स्पष्टीकरण को एक अच्छा (और जहाँ तक मैं सही मानता हूँ) प्रदान करता है, और मैं उन्हें पूर्णता के लिए यहाँ संक्षेप में प्रस्तुत करूँगा। ध्यान दें कि UTF-16 और UTF-32 में एंडियनस के लिए वेरिएंट हैं ।
UTF-32, UTF-32LE, UTF-32BE
सबसे सरल एन्कोडिंग, प्रत्येक कोड बिंदु को इसके संख्यात्मक मान के बराबर 4 बाइट्स में एन्कोड किया गया है। LE / BE एंडियननेस (थोड़ा एंडियन / बड़ा एंडियन) का प्रतिनिधित्व करता है।
UTF-16, UTF-16LE, UTF-16BE
कोड अंक U+0000 - U+FFFF
इसके बाइट में संख्यात्मक मान के बराबर 2 बाइट्स में एन्कोड किए गए हैं। सरोगेट्स की एक जोड़ी का उपयोग करके बड़े मानों को एन्कोड किया जाता है जो आरक्षित मान हैं U+D800 - U+DFFF
। तो अंक से अधिक सांकेतिक शब्दों में बदलना करने के लिए U+FFFF
, निम्नलिखित एल्गोरिथ्म का इस्तेमाल किया जा सकता है (बेशर्मी से विकिपीडिया से कॉपी ):
- 0x010000 कोड बिंदु से घटाया जाता है, 0. बिट x0FFFFF में 20 बिट संख्या छोड़कर।
- प्रथम कोड यूनिट या लीड सरोगेट देने के लिए शीर्ष दस बिट्स (रेंज 0..0x03FF में एक नंबर) को 0xD800 में जोड़ा जाता है, जो 0xD800..0xDBFF [...] रेंज में होगा।
- दूसरी कोड यूनिट या ट्रेल सरोगेट देने के लिए कम दस बिट्स (सीमा 0..0x03FF में भी) 0xDC00 में जोड़े जाते हैं, जो कि 0xDC00..0xDFFF [...] रेंज में होगा।
UTF-8
कोड अंक U+0000 - U+007F
1 बाइट के रूप में इसके सांख्यिक मूल्य के बराबर एन्कोडेड हैं। इनसे U+0080 - U+07FF
एन्कोड किया जाता है 110xxxxx 10xxxxxx
, जैसे U+0800 - U+FFFF
कि 1110xxxx 10xxxxxx 10xxxxxx
, उच्च मूल्य हैं 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
। x
के कोड बिंदु के संख्यात्मक मान से बिट्स हैं।
बीओएम
बाइट-ऑर्डर मार्क (BOM U+FEFF
) का उपयोग एंडियननेस को इंगित करने के लिए पहले कोड बिंदु के रूप में किया जाता है। बीओएम पर अक्सर पूछे जाने वाले प्रश्नों के दिशानिर्देशों के बाद , बीओएम का उपयोग निम्नानुसार किया जाएगा: क्योंकि UTF-8, UTF-16 and UTF-32
यह वैकल्पिक है। यदि बीओएम अनुपस्थित है UTF-16
या UTF-32
, इसे बड़ा एंडियन माना जाता है। BOM में दिखाई नहीं देना चाहिएUTF-16LE, UTF-16BE, UTF-32LE and UTF-32BE
।
आम ख़राबियाँ अमान्य UTF के कारण
विभिन्न चीजें यूटीएफ को अमान्य करने के लिए बाइट अनुक्रम का कारण बन सकती हैं।
- UTF-8 और UTF-32: सीधे सरोगेट कोड पॉइंट (
U+D800 - U+DFFF
), या कोड पॉइंट को अधिक से अधिक एनकोडिंगU+10FFFF
। - UTF-8: कई अमान्य बाइट अनुक्रम।
- UTF-16: अनुचित, या अनुचित तरीके से जोड़े गए सरोगेट।
- BOM: एन्कोडिंग अनुभाग में निर्दिष्ट के रूप में इस्तेमाल किया जाना चाहिए। ध्यान दें कि आउटपुट करते समय
UTF-16
याUTF-32
(कोई अंतर्निहित अंतःकरण निर्दिष्ट नहीं) आप चुन सकते हैं, लेकिन थोड़ा एंडियन के साथ, आपको बीओएम को शामिल करना होगा ।
ध्यान दें कि गैर-वर्ण और बिना असाइन किए गए कोड बिंदु (दोनों सरोगेट्स से अलग) को नियमित पात्रों की तरह माना जाना चाहिए।
''⎕R''⍠'InEnc' 'UTF16BE' 'OutEnc' 'UTF8-BOM'
।