utf32_t wtf32; wtf32.size = str.length; wtf32.data = (uint32_t *)malloc(sizeof(uint32_t) * str.length); int j = 0; for(unsigned int i = 0; i < wtf32.size; i++) { if((*(str.data + j)) >= 0x80) { /* multibyte character */ if(((*(str.data + j) & 0xFFFF ) & 0xF0) == 0xF0) { /* 4-tavuiset */ *(wtf32.data + i) = ((*(str.data + j) & 0x7) << 18); *(wtf32.data + i) |= ((*(str.data + ++j) & 0x3F) << 12); *(wtf32.data + i) |= ((*(str.data + ++j) & 0x3F) << 6); *(wtf32.data + i) |= ((*(str.data + ++j) & 0x3F)); } else if(((*(str.data + j) & 0xFFFF) & 0xE0) == 0xE0) { /* 3-tavuiset */ *(wtf32.data + i) = ((*(str.data + j) & 0xF) << 12); *(wtf32.data + i) |= ((*(str.data + ++j) & 0x3F) << 6); *(wtf32.data + i) |= ((*(str.data + ++j) & 0x3F)); } else if(((*(str.data + j) & 0xFFFF) & 0xC0) == 0xC0) { /* 2-tavuiset */ *(wtf32.data + i) = ((*(str.data + j) & 0x1F) << 6); *(wtf32.data + i) |= ((*(str.data + ++j) & 0x3F)); } } else { *(wtf32.data + i) = (*(str.data + j)); } j++; } return wtf32;