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