判断给定的字符序列是不是一个有效的UTF-8编码
这个题目看懂题目就很简单的,首先要知道UTF-8是个不定长的编码,也就是说每个字符的长度可能是1-4个字节,具体是怎么表示的呢?
第一个字节如果第一位0,那么它自己表示一个字符
如果前三位是110,那么表示当前字节和接下来的一个字节一起表示一个字符,并且后面的字节前两位都是10
如果前四位是1110,那么表示当前字节和接下来的两个字节一起表示一个字符,并且后面的字节前两位都是10
如果前五位是11110,那么表示当前字节和接下来的三个字节一起表示一个字符,并且后面的字节前两位都是10
如图表示
Char. number range | UTF-8 octet sequence
(hexadecimal) | (binary)
--------------------+---------------------------------------------
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
public boolean validUtf8(int[] data) {
int c = 0;
for (int d : data) {
if (c == 0) {
if (d >> 5 == 0b110) c = 1;
else if (d >> 4 == 0b1110) c = 2;
else if (d >> 3 == 0b11110) c = 3;
else if ((d >> 7) != 0) return false;
} else {
if (d >> 6 != 0b10) return false;
c--;
}
}
return c == 0;
}