38 for (std::size_t i = 0; i < len; ++i)
40 unsigned char c = s[i];
45 else if ((c >= 0xC2 && c <= 0xDF) && (i + 1 < len))
47 if (!(s[i + 1] & 0x80) || (s[i + 1] & 0x40))
return false;
50 else if ((c >= 0xE0 && c <= 0xEF) && (i + 2 < len))
52 if (!(s[i + 1] & 0x80) || (s[i + 1] & 0x40) || !(s[i + 2] & 0x80) || (s[i + 2] & 0x40))
return false;
55 else if ((c >= 0xF0 && c <= 0xF4) && (i + 3 < len))
57 if (!(s[i + 1] & 0x80) || (s[i + 1] & 0x40) || !(s[i + 2] & 0x80) || (s[i + 2] & 0x40) || !(s[i + 3] & 0x80) || (s[i + 3] & 0x40))
return false;