int get_utf8(const char *buffer, int offset, unsigned int *code) { *code = 0; /* 0x80 = b10000000 */ if (isbitset(buffer[offset], 7)) { *code |= ((int)buffer[offset + 1] & 0x7F) << 00; return 1; } if (isbitclear(buffer[offset], 5)) { *code |= ((int)buffer[offset + 0] & 0x1F) << 06; *code |= ((int)buffer[offset + 1] & 0x3F) << 00; return 2; } if (isbitclear(buffer[offset], 4)) { *code |= ((int)buffer[offset + 0] & 0x0E) << 12; *code |= ((int)buffer[offset + 1] & 0x3F) << 06; *code |= ((int)buffer[offset + 2] & 0x3F) << 00; return 3; } if (isbitclear(buffer[offset], 3)) { *code |= ((int)buffer[offset + 0] & 0x07) << 18; *code |= ((int)buffer[offset + 1] & 0x3F) << 12; *code |= ((int)buffer[offset + 2] & 0x3F) << 06; *code |= ((int)buffer[offset + 3] & 0x3F) << 00; return 4; } if (isbitclear(buffer[offset], 2)) { *code |= ((int)buffer[offset + 0] & 0x03) << 24; *code |= ((int)buffer[offset + 1] & 0x3F) << 18; *code |= ((int)buffer[offset + 2] & 0x3F) << 12; *code |= ((int)buffer[offset + 3] & 0x3F) << 06; *code |= ((int)buffer[offset + 4] & 0x3F) << 00; return 5; } if (isbitclear(buffer[offset], 1)) { *code |= ((int)buffer[offset + 0] & 0x01) << 30; *code |= ((int)buffer[offset + 1] & 0x3F) << 24; *code |= ((int)buffer[offset + 2] & 0x3F) << 18; *code |= ((int)buffer[offset + 3] & 0x3F) << 12; *code |= ((int)buffer[offset + 4] & 0x3F) << 06; *code |= ((int)buffer[offset + 5] & 0x3F) << 00; return 6; } return 0; }