UTF-8 中的一个字符可能的长度为 1 到 4 字节,遵循以下的规则:
对于 1 字节的字符,字节的第一位设为0,后面7位为这个符号的unicode码。 对于 n 字节的字符 (n > 1),第一个字节的前 n
位都设为1,第 n+1 位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。
注意: 输入是整数数组。只有每个整数的最低 8 个有效位用来存储数据。这意味着每个整数只表示 1 字节的数据。来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/utf-8-validation
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
bool validUtf8(int* data, int dataSize){
int counter = 0;
for(int i = 0; i < dataSize; i++)
{
if(counter > 0)
{
if(data[i] >> 6 != 2) return false;
counter--;
}
else if(data[i] >> 7 == 0)
{
counter = 0;
}
else if((data[i] >> 5) == 6)
{
counter = 1;
}
else if((data[i] >> 4) == 14)
{
counter = 2;
}
else if((data[i] >> 3) == 30)
{
counter = 3;
}
else
{
return false;
}
}
if(counter == 0) return true;
return false;
}
思路:按照题目要求,判断前缀,前缀只有4种,0xxx xxxx, 110xx xxxx, 1110x xxxx, 11110 xxxx,其他都是错误的。还有如果是11110 xxxx, 那么接下来的三个数字前缀都是10xx xxxx格式。假如有第四个数字,那么前缀不能为10xx xxxx格式,只能是0xxx xxxx这样的,不然就是错误的格式。