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

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


मान लीजिए हमारे पास डेटा का प्रतिनिधित्व करने वाली पूर्णांकों की एक सूची है। हमें जांचना है कि यह वैध UTF-8 एन्कोडिंग है या नहीं। एक UTF-8 वर्ण 1 से 4-बाइट लंबा हो सकता है। कुछ गुण हैं:

  • 1-बाइट वर्ण के लिए, पहला बिट 0 होता है, उसके बाद इसका यूनिकोड कोड होता है।
  • n-बाइट वर्ण के लिए, पहले n-बिट्स सभी 1 होते हैं, n+1 बिट 0 होता है, उसके बाद n-1 बाइट्स होती हैं जिनके सबसे महत्वपूर्ण 2 बिट्स 10 होते हैं।

इसलिए एन्कोडिंग तकनीक निम्नानुसार है:

वर्ण संख्या सीमाUTF-8 ऑक्टेट अनुक्रम
0000 0000 0000 007F0xxxxxxx
0000 0080 0000 07FF110xxxxx 10xxxxxx
0000 0800 0000 FFFF1110xxxx 10xxxxxx 10xxxxxx
0001 0000 0010 FFFF11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

उदाहरण के लिए, यदि इनपुट [197, 130, 1] जैसा है, तो यह ऑक्टेट अनुक्रम 11000101 10000010 00000001 का प्रतिनिधित्व करता है, इसलिए यह true लौटाएगा। यह 2-बाइट वर्ण के बाद 1-बाइट वर्ण के लिए एक वैध utf-8 एन्कोडिंग है।

इसे हल करने के लिए, हम निम्नलिखित चरणों का पालन करेंगे:

  • cnt := 0
  • i को 0 से डेटा सरणी के आकार तक लूप करें
    • x := data[i]
    • यदि cnt = 0, तो
      • यदि x/32 = 110, तो cnt को 1 सेट करें
      • अन्यथा जब x/16 = 1110, तो cnt = 2
      • अन्यथा जब x/8 = 11110, तो cnt = 3
      • अन्यथा जब x/128 = 0, तो गलत लौटाएं
    • अन्यथा जब x / 64 = 10 नहीं है, तो गलत लौटाएं और cnt को 1 से घटाएं
  • जब cnt = 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. - लिनक्स पर C++ के लिए सर्वश्रेष्ठ IDE कौन सा है?

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

  1. - लिनक्स पर C++ के लिए शीर्ष IDE

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