uint32_t GetUtf8Char(uint32_t* i, const std::string &m_text){
static const char trailingBytesForUTF8[256] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5
};
static const uint32_t offsetsFromUTF8[6] = {
0x00000000UL, 0x00003080UL, 0x000E2080UL,
0x03C82080UL, 0xFA082080UL, 0x82082080UL };
uint32_t first = (uint8_t)m_text[*i];
uint32_t ch = 0;
int count = *i;
unsigned short extraBytesToRead = trailingBytesForUTF8[first];
switch (extraBytesToRead) {
case 5: ch += (uint8_t)m_text[count++]; ch <<= 6;
case 4: ch += (uint8_t)m_text[count++]; ch <<= 6;
case 3: ch += (uint8_t)m_text[count++]; ch <<= 6;
case 2: ch += (uint8_t)m_text[count++]; ch <<= 6;
case 1: ch += (uint8_t)m_text[count++]; ch <<= 6;
case 0: ch += (uint8_t)m_text[count++];
}
*i = count - 1;
ch -= offsetsFromUTF8[extraBytesToRead];
return ch;
}