Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

การตรวจสอบ UTF-8 ใน C++

ให้อาร์เรย์จำนวนเต็มแทนไบต์ข้อมูล ตรวจสอบว่าเป็น UTF-8 ที่ถูกต้องหรือไม่ กฎ UTF-8:

  • 1 ไบต์: เริ่มด้วย 0
  • n ไบต์: เริ่มด้วย n ตัว 1 แล้วตามด้วย 0 ต่อมา n-1 ไบต์ ต้องเริ่มด้วย 10

ตัวอย่าง: [197,130,1] → true (11000101 10000010 00000001 = 2-byte char + 1-byte char)

ขั้นตอนการแก้ปัญหา

  1. cnt = 0 (จำนวนไบต์ต่อเนื่องที่คาดหวัง)
  2. วนแต่ละไบต์ x:
    • ถ้า cnt == 0 (เริ่มตัวอักษรใหม่):
      • (x >> 5) == 0b110 → cnt = 1
      • (x >> 4) == 0b1110 → cnt = 2
      • (x >> 3) == 0b11110 → cnt = 3
      • (x >> 7) != 0 → invalid (ไม่ใช่ 1-byte และไม่ match pattern)
    • มิฉะนั้น (อยู่ในไบต์ต่อเนื่อง): ต้องมี (x >> 6) == 0b10 มิฉะนั้น invalid, cnt--
  3. สิ้นสุด คืน cnt == 0

ตัวอย่างโค้ด C++

#include <bits/stdc++.h>
using namespace std;

class Solution {
public:
    bool validUtf8(vector<int>& data) {
        int cnt = 0;
        for (int x : data) {
            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;
    }
};

int main() {
    Solution ob;
    vector<int> v = {197,130,1};
    cout << ob.validUtf8(v);
}

Input

[197,130,1]

Output

1