UTF-8字节切片的任意子切片是否也符合UTF-8编码规范?
结论
该假设不成立:合法UTF-8编码的字节切片,其任意子切片不一定同样是有效UTF-8编码。
原因
UTF-8属于变长编码,单个Unicode字符对应的字节长度为1~4字节,编码规则如下:
- 单字节ASCII字符:最高位为0,格式为
0xxxxxxx - 多字节字符:首字节最高位连续N个1代表该字符占N字节,后续N-1个字节均为
10xxxxxx格式的续字节
如果子切片的切割位置落在某个多字节字符的中间,就会产生无效编码,常见两种场景:
- 子切片以续字节开头,找不到对应的首字节匹配
- 子切片末尾的多字节字符首字节缺少足够的续字节支撑
反例
以中文字符「好」为例,它的UTF-8编码为3个字节:[0xE5, 0xA5, 0xBD]
- 原始切片
b1 = [0xE5, 0xA5, 0xBD]本身是完全合法的UTF-8编码 - 取下标
i=1, j=3,得到子切片b2 = b1[1..3] = [0xA5, 0xBD] - 该子切片中的两个字节都是
10xxxxxx格式的续字节,没有对应首字节,属于非法UTF-8编码
内容的提问来源于stack exchange,提问作者Jorge Leitao
相关产品推荐
相关产品推荐

