Не существует действительно надежного способа, но, по сути, случайная последовательность байтов (например, строка в стандартной 8-битной кодировке) вряд ли будет допустимой строкой UTF-8 (если самый старший бит байта). установлено, есть очень конкретные правила относительно того, какие байты могут следовать за ним в UTF-8), вы можете попробовать декодировать строку как UTF-8 и считать, что это UTF-8, если нет ошибок декодирования.
Определение наличия ошибок декодирования - это еще одна проблема, многие библиотеки Unicode просто заменяют недопустимые символы знаком вопроса, не указывая, произошла ли ошибка. Поэтому вам нужен явный способ определить, произошла ли ошибка при декодировании или нет.