UTF-8 एक चर-चौड़ाई प्रारूप में यूनिकोड कोडपॉइंट्स को एनकोड करने के लिए एक अपेक्षाकृत सरल तरीका है कि यह आसानी से कोड को भ्रमित नहीं करता है जो यूनिकोड के बारे में पता नहीं है।
UTF-8 का अवलोकन
- 1-0x7F की सीमा में बाइट्स, समावेशी, सामान्य रूप से मान्य हैं
- बिट पैटर्न के साथ बाइट्स को
10XX XXXXनिरंतरता बाइट्स माना जाता है, जिसमें छह कम से कम महत्वपूर्ण बिट्स का उपयोग कोडपॉइंट के भाग को एनकोड करने के लिए किया जाता है। जब तक वे पूर्ववर्ती बाइट से अपेक्षित नहीं होते, तब तक वे प्रकट नहीं होंगे। - पैटर्न के साथ बाइट्स
110X XXXXबाद में एक निरंतरता बाइट की उम्मीद करते हैं - पैटर्न के साथ बाइट्स
1110 XXXXदो निरंतरता बाइट्स की अपेक्षा करते हैं - पैटर्न के साथ
1111 0XXXबाइट्स बाद में तीन निरंतरता बाइट्स की उम्मीद करते हैं - अन्य सभी बाइट अमान्य हैं और UTF-8 स्ट्रीम में कहीं भी नहीं दिखनी चाहिए। 5, 6, और 7 बाइट क्लस्टर्स सिद्धांत में संभव हैं, लेकिन इस चुनौती के प्रयोजनों के लिए अनुमति नहीं दी जाएगी।
लंबे समय तक एनकोडिंग
UTF-8 के लिए यह भी आवश्यक है कि एक कोडपॉइंट को न्यूनतम बाइट्स के साथ दर्शाया जाए। कोई भी बाइट अनुक्रम जिसे कम बाइट्स के साथ दर्शाया जा सकता है, मान्य नहीं है। संशोधित UTF-8 नल वर्णों (U + 0000) के लिए इसमें एक अपवाद जोड़ता है, जिसे C0 80(हेक्स प्रतिनिधित्व) के रूप में दर्शाया जाना चाहिए , और इसके बजाय null बाइट्स को स्ट्रीम में कहीं भी प्रदर्शित करने के लिए अस्वीकृत करता है। (यह इसे शून्य-समाप्त स्ट्रिंग्स के साथ संगत बनाता है)
चुनौती
आपको एक कार्यक्रम बनाना है, जब बाइट्स की एक स्ट्रिंग दी जाती है, तो यह निर्धारित करेगा कि क्या वह स्ट्रिंग मान्य संशोधित UTF-8 का प्रतिनिधित्व करता है और यदि वैध और गलत तरीके से मान रखता है तो एक सत्य मान लौटाएगा। ध्यान दें कि आपको लंबे समय तक एन्कोडिंग और नल बाइट्स के लिए जांच करनी चाहिए (क्योंकि यह संशोधित यूटीएफ -8 है)। आपको UTF-8 मान को डीकोड करने की आवश्यकता नहीं है।
उदाहरण
41 42 43 ==> yes (all bytes are in the 0-0x7F range)
00 01 02 ==> no (there is a null byte in the stream)
80 7F 41 ==> no (there is a continuation byte without a starter byte)
D9 84 10 ==> yes (the correct number of continuation bytes follow a starter byte)
F0 81 82 41 ==> no (there are not enough continuation bytes after F0)
EF 8A A7 91 ==> no (too many continuation bytes)
E1 E1 01 ==> no (starter byte where a continuation byte is expected)
E0 80 87 ==> no (overlong encoding)
41 C0 80 ==> yes (null byte encoded with the only legal overlong encoding)
F8 42 43 ==> no (invalid byte 'F8')
नियम
- मानक नियम और खामियां लागू होती हैं
- इनपुट और आउटपुट किसी भी सुविधाजनक प्रारूप में हो सकते हैं जब तक कि अहस्ताक्षरित बाइट रेंज (0-255) में सभी मूल्यों को पढ़ा जा सकता है।
- आपको एक नल-समाप्त स्ट्रिंग के बजाय एक सरणी या फ़ाइल का उपयोग करने की आवश्यकता हो सकती है। आपको अशक्त बाइट्स पढ़ने में सक्षम होने की आवश्यकता है।
- सबसे छोटा कोड जीतता है!
- ध्यान दें कि यूटीएफ -8 को डिकोड करने के लिए बिल्डरों का उपयोग करना यहां दी गई आवश्यकताओं के अनुरूप होने की गारंटी नहीं है। आपको इसके आसपास काम करने और विशेष मामले बनाने की आवश्यकता हो सकती है।
संपादित करें: यूटीएफ -8 को डिकोड करने वाले बिल्डरों का उपयोग नहीं करने के लिए जोड़ा गया बोनस
EDIT2: केवल रुस्त उत्तर योग्य होने के कारण बोनस हटा दिया गया है और इसे परिभाषित करना अजीब है।