RFC 3629 описывает структуру символов UTF-8. Если вы посмотрите на это, то увидите, что найти недопустимые символы довольно просто, И что следующую границу символа всегда легко найти (это символ <128 или один из начальных маркеров «длинного символа», с начальными битами 110, 1110 или 11110). </p>
Но BKB, вероятно, является правильным - самый простой ответ - позволить Perl сделать это за вас, хотя я не уверен, что делает Perl, когда обнаруживает неправильный utf-8 с этим фильтром.