Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

C++ में UTF-8 सत्यापन

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

  1. C++ . में पहचानकर्ता

    C++ पहचानकर्ता एक ऐसा नाम है जिसका उपयोग किसी चर, फ़ंक्शन, वर्ग, मॉड्यूल, या किसी अन्य उपयोगकर्ता-परिभाषित आइटम की पहचान करने के लिए किया जाता है। एक पहचानकर्ता अक्षर A से Z या a से z या अंडरस्कोर (_) से शुरू होता है और उसके बाद शून्य या अधिक अक्षर, अंडरस्कोर और अंक (0 से 9) होते हैं। C++ पहचानकर्त

  1. Linux पर C++ का सबसे अच्छा IDE क्या है?

    केवल टेक्स्ट एडिटर्स पर बड़े प्रोजेक्ट्स को मैनेज करना मुश्किल है। यदि आप ऐसे मामलों में आईडीई का उपयोग करते हैं तो आप अधिक उत्पादक और कम निराश होने की संभावना रखते हैं। विभिन्न प्रकार के आईडीई हैं और आपको अपनी आवश्यकताओं के अनुरूप सही का चयन करना चाहिए। Linux पर C++ के लिए एक भी सर्वश्रेष्ठ IDE नही

  1. Linux पर c++ के लिए शीर्ष IDE क्या है?

    केवल टेक्स्ट एडिटर्स पर बड़े प्रोजेक्ट्स को मैनेज करना मुश्किल है। यदि आप ऐसे मामलों में आईडीई का उपयोग करते हैं तो आप अधिक उत्पादक और कम निराश होने की संभावना रखते हैं। विभिन्न प्रकार के आईडीई हैं और आपको अपनी आवश्यकताओं के अनुरूप सही का चयन करना चाहिए। यहाँ Linux के लिए सर्वश्रेष्ठ C/C++ IDE की सू