Есть Unicode - это огромная таблица всех символов в мире. У них там свои номера, которые никак не меняются (все символы пронумерованы). И вот для этого юникода есть кодировки, одна из которыз UTF-8 (а другие - UTF-16, UTF-32). Что такое кодировка - это таблица из последовательностей байт, отображаемых на символы. Одна последовательность байт ставится в соответствие одному символу. Соответственно, одна последовательно байт с помощью UTF-8 ставится в соответствие одному символу в Unicode (по его номеру). И наоборот, одному символу в Unicode (его номеру) ставится в соответствие одна последовательность байт в кодировке UTF-8. То есть туда-сюда можно переводить.
Дальше ты читаешь последовательность байт и её можно превратить в одно число по определённому алгоритму и потом это число уже берётся в юникоде и там смотрится символ.
Сама кодировка UTF-8 (закон преобразования) очень просто устроена: она берёт первый байт, в нём записано, сколько там ещё байт нужно взять. Потом эти байты берутся и целиком рассматриваются в виде непрерывной последовательности бит, из которой можно составить число. И потом это число ищется в юникоде уже.
Дальше ты хочешь понять, а что же такое cp1251. Это тоже кодировка, но она никак не связана с Unicode. Вместо Unicode там используется другая таблица (очень маленькая табличка на 256 символов), поэтому там хватает одного байта, чтобы получить код любого символа в этой таблице. И в ней как раз есть своя кириллица, поэтому для неё кириллица помещается в один байт.