Возможно, вы думаете об этом немного неправильно. UTF-8 - это кодировка , которая полезна для сериализации данных, например, запись его в файл или сеть. Однако это очень нетривиальное кодирование, и необработанная строка кодовых точек Unicode может заканчиваться любым количеством закодированных байтов.
Что вам, вероятно, следует сделать, если вы хотите обрабатывать текст (с учетом вашего описания), это хранить raw , строки фиксированной ширины внутри. Если вы выбираете Unicode (что вам и нужно), то вам нужно 21 бит на кодовую точку, поэтому ближайший целочисленный тип - uint32_t
. Короче говоря, храните все свои строки внутри себя как массивы целых чисел. Затем вы можете получить произвольный доступ к каждой кодовой точке.
Кодировать только в UTF-8, когда вы записываете в файл или консоль, и декодировать из UTF-8 при чтении.
Кстати, кодовая точка Unicode все еще далека от символа . Понятие персонажа просто далеко до высокого уровня, чтобы иметь простую общую механику. (Например, "a" + "акцентная могила" - две кодовые точки, сколько символов?)