uft-8인지 검증하는 알고리즘은 문자열들이 uft-8 형태인지 체크하는 알고리즘입니다.
def validUtf8(self, data: List[int]) -> bool:
def check(size):
for i in range(start+1, start+size+1):
if i>= len(data) or (data[i] >> 6) != 0b10:
return False
return True
start = 0
while start < len(data): # list iterate
first = data[start]
if (first >> 3) == 0b11110 and check(3):
start +=4
elif (first >> 4) == 0b1110 and check(2):
start +=3
elif (first >> 5) == 0b110 and check(1):
start +=2
elif (first >> 7) == 0:
start +=1
else:
return False
return True
while을 사용한 이유는 여러 문자열을 통해 4바이트의 경우 후, 3 바이트의 경우가 올 수 있기 때문에 while을 사용한것이라고 생각합니다.
if ,elif를 통해 4바이트인 경우부터 1바이트의 경우까지 first의 비트 shifting을 통해 체크해줍니다. 동시에 check(개수) 함수를 호출합니다.
check 함수는 이후 문자열들이 각각의 바이트에 맞는 (10 ~ 형태)를 유지하고 있는지 체크해주는 함수입니다. 여기서 false는 utf-8이 아니라는 뜻이 됩니다.
이렇게 start이 list를 넘지 않을 때까지 체크해주다가 전부 문제가 없다면 True로 반환해줍니다.