说明UTF8中的一个字符可以是1到4字节长,遵循以下规则:对于1字节字符,第一位是0,后面是它的unicode代码。对于n-bytes字符,前n位全是1,n+1位为0,然后是n-1个字节,最高有效2位为10。这就是UTF-8编码的工作方式:Char。号码范围|UTF-8八位字节序列(十六进制)|(二进制)--------------------+------------------------------------------00000000-0000007F|0xxxxxxx00000080-000007FF|110xxxxx10xxxxxx00000800-0000FFFF|1110xxxx10xxxxxx10xxxxxx00010000-0010FFFF|11110xxx10xxxxxx10xxxxxx10xxxxxx给定一个表示数据的整数数组,返回它是否是有效的utf-8编码。注意:输入是一个整数数组。只有每个整数的最低有效8位用于存储数据。这意味着每个整数ger只代表1个字节的数据。例1:data=[197,130,1],表示八位序列:110001011000001000000001。返回true。它是2字节字符后跟1字节字符的有效utf-8编码。示例2:data=[235,140,4],表示八位字节序列:111010111000110000000100。返回false。前3位全为1,第4位为0表示是3字节字符。下一个字节是以10开头的连续字节,这是正确的。但是第二个continuationbyte并不是以10开头的,所以是无效的。UTF-8描述了一个字符可能的长度,从1到4个字节,遵循以下规则:对于1个字节的字符,该字节的第一位设置为0,接下来的7位是这个字符的unicode编码象征。对于n字节字符(n>1),第一个字符字节的前n位全部设为1,第n+1位设为0,后面字节的前两位全部设为10.其余未提及的二进制位均为该符号的unicode编码。这就是UTF-8编码的工作原理:Char。号码范围|UTF-8八位字节序列(十六进制)|(二进制)------------------+------------------------------------------00000000-0000007F|0xxxxxxx00000080-000007FF|110xxxxx10xxxxxx00000800-0000FFFF|1110xxxx10xxxxxx10xxxxxx00010000-0010FFFF|注意:输入是一个整数数组。每个整数只有最低有效的8位用于存储数据。这意味着每个整数仅代表1个字节的数据。例1:data=[197,130,1],表示一个8位序列:110001011000001000000001。返回true。这是一个2字节字符后跟1字节字符的有效utf-8编码。示例2:data=[235,140,4],表示一个8位序列:111010111000110000000100。返回false。前3位全为1,第4位为0表示是3字节字符。下一个字节是从10开始的延续字节,是正确的。但是第二个continuationbyte并不是以10开头的,所以是非法的。来源:LeetCode链接:https://leetcode-cn.com/probl...版权归LeetCode网络所有。商业转载请联系官方授权,非商业转载请注明出处。想法是根据条件来判断的。如果以0开头,表示单码;2、如果以110开头,则表示后面是一个以10开头的八位码;3、如果以1110开头,则表示后面是两个以10段代码开头的八位字节;4、如果以11110开头,表示后面是10开头的三个字节码;所以我们需要判断的是1,这个数的二进制表示中第一个0之前的1的个数;2.以10开头的数字;我们用二进制表示数字,然后将它们转换成字符串,并使用正则表达式来匹配它们。#-*-coding:utf-8-*-#@Author:HeRui#@CreateDate:2019-08-2410:55:33#@LastModifiedby:HeRui#@LastModifiedtime:2019-08-2411:59:50importrefromtypingimportListclass解决方案:defvalidUtf8(self,data:List[int])->bool:next_=0pattern=re.compile("0b(.*?)0.*")#匹配第一个0之前1的个数whilenext_!=-1andnext_
