Характер Юникод как таковой является абстрактным понятием. Когда символы кодируются как строки байтов, они могут иметь разную длину. В UTF-32 каждый символ имеет 4 байта. В UTF-16 каждый символ имеет 2 или 4 байта. В UTF-8 каждый символ равен 1, 2, 3 или 4 байтам.
В UTF-16 первые два байта определяют, есть ли еще два байта. Дополнительные байты присутствуют, если количество, определяемое первыми двумя байтами, находится в определенном диапазоне, называемом «высокие суррогаты».
В UTF-8 битовая диаграмма первого байта определяет количество байтов для символа. Если самый старший бит равен 0, есть только этот байт (поэтому символы Ascii представлены так же, как в Ascii). Если первые три бита равны 110, то имеется еще один байт. Если первые четыре бита - 1110, еще два байта, а если 1111 - еще три байта.
Если вы берете произвольный байт из потока UTF-8, вы не можете вообще решить, является ли это частью представления 2, 3 или 4 байта. Если это один из шаблонов, описанных для стартового байта, вы знаете, что это такое. Но если он начинается с бит 10, вы не можете знать.
Это означает, что поток UTF-8 должен обрабатываться последовательно. Непосредственная адресация по положению персонажа невозможна; чтобы найти N-го символа, вам нужно начать чтение с начала и наблюдать битовые шаблоны стартовых байтов.
Зависит от кодировки. –
Нет такой вещи, как персонаж. В зависимости от того, что вы делаете, вам может понадобиться понять различия между глифами (может быть очень длинными), кодовыми точками, кодовыми единицами и другими. http://utf8everywhere.org для универсального магазина о том, как делать все правильно. –