Это очень сильно зависит от того, что вы считаете «буквой».
UTF8 - это, по сути, крошечный кусочек Unicode.
В основном есть как минимум три уровня: байты, кодточки и графемы кластеров.Кодовая точка может быть закодирована одним или несколькими байтами в соответствии с определенной кодировкой, такой как UTF8, UTF16 или UTF32.Эта кодировка уникальна (потому что все альтернативные способы объявлены недействительными).Однако кодовая точка не всегда является глифом, потому что есть так называемые комбинирующие символы.Такие комбинирующие символы следуют за базовым символом и, как следует из их названия, объединяются с базовым символом.Например, есть комбинирующий символ U + 0308 ДИАРЕЗ КОМБИНИРОВАНИЯ, который ставит диарез (¨) над предыдущей буквой.Таким образом, если он следует, например, a (U + 0061 LATIN SMALL LETTER A), результатом является ä.Однако есть также одна кодовая точка для буквы ä (U + 00E4 МАЛЕНЬКОЕ ПИСЬМО А С ДИАРЕЗОМ), поэтому это означает, что кодовые последовательности U + 0061 U + 0308 и U + 00E4 описывают одну и ту же букву.
Таким образом, каждая кодовая точка имеет единственную действительную кодировку UTF 8 (например, U + 0061 это «\ 141», U + 0308 это «\ 314 \ 210» и U + 00e4 это «\ 303 \ 244», но буква äкодируется как последовательностью кодовых точек U + 0061 U + 0308, то есть в UTF8, байтовой последовательностью "\ 141 \ 314 \ 210", так и одиночной кодовой точкой U + 00E4, то есть байтовой последовательностью "\ 303 \ 244".
Что еще хуже, поскольку производители Unicode решили, что объединяющие буквы следуют за базовой буквой, а не перед ней, вы не сможете узнать, завершен ли ваш глиф, пока не увидите следующая кодовая точка (если это не комбинация кодовой точки, ваше письмо закончено).