C ++中的UTF-8验证
假设我们有一个表示数据的整数列表。我们必须检查它是否是有效的UTF-8编码。一个UTF-8字符可以是1到4字节长。有一些属性-
对于1字节字符,第一位为0,后跟其unicode码。
对于n字节字符,前n位全为1,n+1位为0,其后为n-1个字节,其中最高有效2位为10。
所以编码技术如下-
因此,如果输入类似于[197、130、1],则表示八位位组序列110001011000001000000001,因此它将返回true。这是2字节字符后跟1字节字符的有效utf-8编码。
为了解决这个问题,我们将遵循以下步骤-
cnt:=0
对于范围在0到数据数组大小的i
如果x/32=110,则将cnt设置为1
否则,当x/16=1110时,cnt=2
否则,当x/8=11110时,cnt=3
否则,当x/128为0时,返回false
x:=数据[i]
如果cnt为0,则
否则,当x/64不为10时,返回false并将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