Это очень просто.
Во-первых, вы должны понять, что вы не можете вычислить позицию без итерации строки (это очевидно для символов переменной длины)
Во-вторых, вам нужно помнить, чтов utf-8
символы могут составлять 1-4 байта, и в случае, если они занимают более одного байта, все завершающие байты имеют 10
значащих битов.Итак, вы просто считаете байты, игнорируя их, если (byte_val & 0xC0) == 0x80
.
К сожалению, сейчас в моем распоряжении нет компилятора, поэтому, пожалуйста, будьте любезны с возможными ошибками в коде:
int desired_index = 19;
int index = 0;
char* p = my_str.c_str();
while ( *p && index < desired_index ){
if ( (*p & 0xC0) != 0x80 ) // if it is first byte of next character
index++;
p++;
}
// now p points to trailing (2-4) bytes of previous character, skip them
while ( (*p & 0xC0) == 0x80 )
p++;
if ( *p ){
// here p points to your desired char
} else {
// we reached EOL while searching
}