393.utf-8-validation.go 445 B

12345678910111213141516171819202122232425262728
  1. func validUtf8(data []int) bool {
  2. n, cnt := len(data), 0
  3. for i, m := 0, 0; i < n; i++ {
  4. if cnt != 0 {
  5. if data[i]>>6 != 2 {
  6. return false
  7. }
  8. cnt--
  9. continue
  10. }
  11. // b10000000 = 0x80
  12. for m = 0x80; m&data[i] != 0; m >>= 1 {
  13. }
  14. switch m {
  15. case 0x80: // 0xxxxxxx
  16. case 0x20: // 110xxxxx
  17. cnt = 1
  18. case 0x10: // 1110xxxx
  19. cnt = 2
  20. case 0x08: // 11110xxx
  21. cnt = 3
  22. default:
  23. return false
  24. }
  25. }
  26. return cnt == 0
  27. }