मान लीजिए कि हमारे पास डेटा का प्रतिनिधित्व करने वाले एक सूची पूर्णांक हैं। हमें यह जांचना होगा कि यह वैध UTF-8 एन्कोडिंग है या नहीं। एक UTF-8 वर्ण 1 से 4-बाइट लंबा हो सकता है। कुछ गुण हैं -
-
1-बाइट वर्ण के लिए, पहला बिट 0 है, उसके बाद उसका यूनिकोड कोड है।
-
n-बाइट्स वर्ण के लिए, पहले n-बिट्स सभी 1s हैं, n+1 बिट 0 है, उसके बाद n-1 बाइट्स हैं जिनमें से सबसे महत्वपूर्ण 2 बिट 10 हैं।
तो एन्कोडिंग तकनीक इस प्रकार है -
वर्ण संख्या श्रेणी | UTF-8 ऑक्टेट अनुक्रम |
0000 0000 0000 007F | 0xxxxxxx |
0000 0080 0000 07FF | 110xxxxx 10xxxxxx |
0000 0800 0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx |
0001 0000 0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
तो अगर इनपुट [197, 130, 1] जैसा है, तो यह ऑक्टेट अनुक्रम 11000101 10000010 0000001 का प्रतिनिधित्व करता है, इसलिए यह सच हो जाएगा। यह 2-बाइट वर्ण के लिए मान्य utf-8 एन्कोडिंग है जिसके बाद 1-बाइट वर्ण होता है।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
सीएनटी:=0
-
मैं के लिए 0 से डेटा सरणी के आकार में
-
एक्स:=डेटा [i]
-
अगर cnt 0 है, तो
-
अगर x/32 =110, तो cnt को 1 के रूप में सेट करें
-
अन्यथा जब x/16 =1110, तब cnt =2
-
अन्यथा जब x/8 =11110, तब cnt =3
-
अन्यथा जब x/128 0 है, तो झूठी वापसी करें
-
-
अन्यथा जब x/64 10 नहीं है, तो झूठी वापसी करें और 1 से कम करें
-
-
सीएनटी के 0 होने पर सही लौटें
उदाहरण(C++)
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
#include <bits/stdc++.h> using namespace std; class Solution { public: bool validUtf8(vector<int>& data) { int cnt = 0; for(int i = 0; i <data.size(); i++){ int x = data[i]; if(!cnt){ if((x >> 5) == 0b110){ cnt = 1; } else if((x >> 4) == 0b1110){ cnt = 2; } else if((x >> 3) == 0b11110){ cnt = 3; } else if((x >> 7) != 0) return false; } else { if((x >> 6) != 0b10) return false; cnt--; } } return cnt == 0; } }; main(){ Solution ob; vector<int> v = {197,130,1}; cout << (ob.validUtf8(v)); }
इनपुट
[197,130,1]
आउटपुट
1