কম্পিউটার

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 00000001 প্রতিনিধিত্ব করে, তাই এটি সত্য হবে। এটি একটি 2-বাইট অক্ষরের জন্য একটি বৈধ utf-8 এনকোডিং এবং তারপরে 1-বাইট অক্ষর৷

এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -

  • cnt :=0

  • আমি 0 থেকে ডাটা অ্যারের আকারের মধ্যে

    • x :=ডেটা[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

    হলে true রিটার্ন করুন

উদাহরণ(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++ এ এনক্যাপসুলেশন

  2. C++ এ শনাক্তকারী

  3. লিনাক্সে C++ এর সেরা IDE কি?

  4. লিনাক্সে c++ এর জন্য শীর্ষ IDE কি?