ʰ
Size: a a a
ʰ
ʰ
S[
S[
Ν
R
R
R
R
ʰ
ʰ
char *get_n_chars_from_utf_8_str(const char *string, size_t n) {
assert(string != NULL);
size_t size = 0;
for (size_t i = 0; i < n; i++) {
const uint8_t *bytes = (uint8_t *) string + size;
uint8_t mask = 1u << 6u | 1u << 7u;
size_t size_of_char = 1;
while ((*bytes & mask) == mask) {
mask = (mask >> 1u) | 1u << 7u;
size_of_char++;
}
for (size_t j = 1; j < size_of_char; j++) {
if ((*(bytes + j) & (1u << 6u | 1u << 7u)) != 1u << 7u)
return NULL;
}
if (size_of_char == 1 && (*bytes & 1u << 7u) == 1u << 7u)
return NULL;
size += size_of_char;
}
return strndup(string, size);
}
ʰ
ʰ
ʰ
ʰ
ʰ
MT
MT