मान लीजिए कि हमारे पास डेटा का प्रतिनिधित्व करने वाले एक सूची पूर्णांक हैं। हमें यह जांचना होगा कि यह वैध 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