Статья подготовлена для студентов курса «Разработчик Python» в образовательном проекте OTUS. Язык программирования Python, появившийся в 1991 году, не мог предсказать будущее и выбрал, оказавшийся не самым лучшим впоследствии, но разумный на тот момент, вариант дефолтной кодировки ASCII. С тех пор много воды утекло. Во-первых, Unicode завоевал мир, во-вторых Python в 3-й версии перешёл на Unicode'ные строки. Но проблема заключается в том, что на уровне интерпретатора нужно всё равно оперировать байтовыми строками. Самая популярная кодировка UTF-8 является "variable width character encoding", т. е. один символ занимает от 1 до 4 байт (это закодировано в первых битах). Это не подходит для языка, где существует индексация в строке за константное время: str[5]. Внутри для представления строки используется один из трёх вариантов: — 1 байт на символ (Latin-1); — 2 байта (UCS-2); — 4 байта (UCS-4). То есть даже если в строке все символы помещаются в один байт, но к ней прибавить emoj